配色: 字号:
java架构师-技术专家-练习手册-第07周 分布式redis
2023-09-21 | 阅:  转:  |  分享 
  
RedisNosql的常见分类键值对数据库 redis Memcache列存储数据库Hbase cassandra文档类型
数据库 MongoDB CouchDB图形数据库Neo4j FlockDB连接redis客户端查看所有key的值:报
(error) NOAUTH Authentication required. 没有授权!需要输入密码:auth admin@re
dis (密码)Redis 的五大类型Redis操作-【String】类型set age 20get agedel ag
eSETNX age 18 //如果这个key存在,不覆盖值。如果不错在,写入redisexpire age 30
//给key设置过期时间,30秒 -2 表示过期了。ttl age //查看key的剩余时间append name
//字符串拼接,返回字符串长度。strlen name //返回字符串长度imcr age //累加,步长为1decr a
ge //累减 步长为1incrby age 10 //在此数值上增加10decrby age 5 //在此数值上减
少5getrange name 0 -1 //截取字符串中的部分内容mset k1 aa k2 bbmget k1
k2 msetnx k4 d k3 jselect 1 //redis 默认有16个库,根据下标切换库flushd
b //将库里的key全部清除flushall //将所有库中的数据全部清除Redis操作-【hash】类型hset use
r name zhangxin //放入hash 中一个user 实体类,属性name 值zhangxinhget use
r name //获取hash中user实体类的name值hmset user age 18 sex man /
/给user实体,多重赋值属性/值hmget user name age sex //获取user实体 多属性的值h
getall user //获取user实体的所有键值对hlen user //查看user实体中有多少个属性hkeys
user //列出user实体的所有key值hwals user //列出 user实体的所有值hincrby use
r age 3 //给实体user 的age 增加 3hincrbyfloat user age 2.3 //给实
体user 的age 增加2.3 带小数的值hexists user age // 判断user实体中是否存在age 存在返
回1 不存在返回0Hdel user age //删除 实体的属性Redis操作-【list】类型lpush list1
pig cow sheep chicken duck //从左边把数据放入Lrang list1 0 -1
rpush list1 pig cow sheep chicken duck //从左边把数据放入Lrang
list1 0 -1lpop list1 //从左边开始,移除list1的值rpop list1 //从右边开始,移除
list值llen list1 //查看list1 的长度lindex list1 2 //下标为2 的值lset
list1 1 1001 //将list1中,下标为1的值,修改为1001linsert list1 before
1001 aaa //list1中在1001之前插入aaalinsert list1 after 1001 aaa
//list1中在1001之后插入aaalrem list1 2 aaa //删除list1中的两个aaaltrim
list1 1 2 //截取并替换list1的值del list1 //删除list1Redis操作-【set
】类型sadd set duck pig cow sheep sheep pig //set集合去重smemb
ers set //查看set值scard set // 查看set数量sismember set pig // 判
断set中是否包含pig 包含返回1 不包含返回0srem set duck //将set中的 duck删除spop s
et //从set中出栈spop set 2 //从set中出栈2个srandmember set 3 //随机从s
et中获取3个数smove set1 set2 10 //将 set1中的10 移到 set2中sdiff set1
set2 //筛选出在set1中有,set2中没有的值 //差集 Sinter set1 set2 //筛选出在set1
中有,set2中也有的值 //交集 sunion set1 set2 //筛选出在set1,set2所有的值 //并
集Redis操作-【zset】类型zadd zset 10 duck 20 pig 30 chicken 40 beef
50 sheep //可排序的set 去重zrange zset 0 -1 //查询zset的所有值zrange
zset 0 -1 withscores //连同分数一起查询zrank zset beff //查询zset中的b
eff 返回下标zscore zset beff //查询zset中beff的分数zcard zset //查询
zset的长度数量zcount zset 20 40 //查询 20到40间 数值的个数。zrangebyscore z
set 20 40 //查询大于等于20 小于等于40的值zrangebyscore zset (20 (40
//查询大于20 小于40的值zrangebyscore zset (20 (40 withscores //查询大
于20 小于40的键值对zrangebyscore zset 20 40 limit 2 3 //根据分数,查询下
标 2后面的三个数zrem zset pig //删除 zset中的pig zrem zset sheep beef
//删除zset中的sheep beefRedis的线程模型Rdsis是单线程的。Springboot整合redispom文件
引入redis包 org.springframe
work.boot
spring-boot-starter-data-redis rtifactId>
模板类:RedisTemplateStringRedisTemplate继承Red
isTemplate RedisTemplate默认采用的是JDK的序列化策略 StringRedisTemplate采用的是S
tring的序列化策略RedisTemplate常用方法:redisTemplate.opsForValue();//操作字符串r
edisTemplate.opsForHash();//操作hashredisTemplate.opsForList();//操作
listredisTemplate.opsForSet();//操作setredisTemplate.opsForZSet();/
/操作有序setValueOperations valueOperations = redisTemplate.opsForVal
ue();BoundValueOperations boundValueOps = redisTempl
ate.boundValueOps("key");测试类:import org.springframework.beans.fac
tory.annotation.Autowired;import org.springframework.data.redis.c
ore.RedisTemplate;import org.springframework.web.bind.annotation.
GetMapping;import org.springframework.web.bind.annotation.Request
Mapping;import org.springframework.web.bind.annotation.RestContro
ller;import springfox.documentation.annotations.ApiIgnore;/ @
Description redis 测试类 @Author zhangxin @Date 20230128 /@Api
Ignore@RestController@RequestMapping("redis")public class RedisCo
ntroller { @Autowired private RedisTemplate redisTemplate; //Stri
ngRedisTemplate继承RedisTemplate RedisTemplate默认采用的是JDK的序列化策略 /Str
ingRedisTemplate采用的是String的序列化策略 @GetMapping("/set") public Obje
ct set(String key,String value){ redisTemplate.opsForValue().set(
key, value); return "OK"; } @GetMapping("/get") public Object ge
t(String key){ return redisTemplate.opsForValue().get(key); } @Ge
tMapping("/delete") public Object delete(String key){ redisTempl
ate.delete(key); return "OK"; }}Redis工具类package com.penghaisoft.w
ms.utils;import org.springframework.beans.factory.annotation.Auto
wired;import org.springframework.data.redis.core.StringRedisTempl
ate;import org.springframework.stereotype.Component;import java.u
til.Map;import java.util.Set;import java.util.concurrent.TimeUnit
;/ @Description 使用redisTemplate的操作实现类 @Author zhangxin @D
ate 2023-02-17 /@Componentpublic class RedisUtil { @Autowired p
rivate StringRedisTemplate redisTemplate; // Key(键),简单的key-value操
作 / 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
@param key @return / public long ttl(String key) { return re
disTemplate.getExpire(key); } / 实现命令:expire 设置过期时间,单位秒 @p
aram key @return / public void expire(String key, long timeout
) { redisTemplate.expire(key, timeout, TimeUnit.SECONDS); } /
实现命令:INCR key,增加key一次 @param key @return / public long in
cr(String key, long delta) { return redisTemplate.opsForValue().i
ncrement(key, delta); } / 实现命令:KEYS pattern,查找所有符合给定模式 patter
n的 key / public Set keys(String pattern) { return redisT
emplate.keys(pattern); } / 实现命令:DEL key,删除一个key @param ke
y / public void del(String key) { redisTemplate.delete(key); } /
/ String(字符串) / 实现命令:SET key value,设置一个key-value(将字符串值 value关
联到 key) @param key @param value / public void set(String k
ey, String value) { redisTemplate.opsForValue().set(key, value);
} / 实现命令:SET key value EX seconds,设置key-value和超时时间(秒) @pa
ram key @param value @param timeout (以秒为单位) / public void
set(String key, String value, long timeout) { redisTemplate.opsFo
rValue().set(key, value, timeout, TimeUnit.SECONDS); } / 实现命令
:GET key,返回 key所关联的字符串值。 @param key @return value / public
String get(String key) { return (String)redisTemplate.opsForValu
e().get(key); } / 实现命令:hasKey key,返回 true flest。 @param k
ey @return value / public boolean hasKey(String key) { return
redisTemplate.hasKey(key); } // Hash(哈希表) / 实现命令:HSET key fie
ld value,将哈希表 key中的域 field的值设为 value @param key @param fiel
d @param value / public void hset(String key, String field, Ob
ject value) { redisTemplate.opsForHash().put(key, field, value);
} / 实现命令:HGET key field,返回哈希表 key中给定域 field的值 @param key
@param field @return / public String hget(String key, String
field) { return (String) redisTemplate.opsForHash().get(key, fie
ld); } / 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域
,不存在的域将被忽略。 @param key @param fields / public void hdel(St
ring key, Object... fields) { redisTemplate.opsForHash().delete(k
ey, fields); } / 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。 @par
am key @return / public Map hgetall(String key
) { return redisTemplate.opsForHash().entries(key); } // List(列表)
/ 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头 @param key
@param value @return 执行 LPUSH命令后,列表的长度。 / public long lpush
(String key, String value) { return redisTemplate.opsForList().le
ftPush(key, value); } / 实现命令:LPOP key,移除并返回列表 key的头元素。 @p
aram key @return 列表key的头元素。 / public String lpop(String key) {
return (String)redisTemplate.opsForList().leftPop(key); } /
实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。 @param key
@param value @return 执行 LPUSH命令后,列表的长度。 / public long rpush(
String key, String value) { return redisTemplate.opsForList().rig
htPush(key, value); }}调用语句:redisUtil.del( U8RedisConstant.StateIn
fo.ARRIVALVOUCH);redisUtil.set(U8RedisConstant.StateInfo.ARRIVALV
OUCH, JSONArray.toJSONString(u8List));redis订阅与发布SUBSCRIBE 订阅PUBL
ISH 发布PSUBSCRIBE 批量订阅Redis持久化redis持久化方式有两种:AOF 持久化: 采用日志的形式来记录每个
写操作,追加到AOF文件的末尾RDB持久化: 内存数据以快照的形式保存到磁盘上RDB持久化配置Redis会将数据集的快照dump到
dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我
们搜索save,可以看到下面的配置信息:save 900 1????????????? #在900秒(15分钟)之后,如果至少有1
个key发生变化,则dump内存快照。save 300 10??????????? #在300秒(5分钟)之后,如果至少有10个k
ey发生变化,则dump内存快照。save 60 10000??????? #在60秒(1分钟)之后,如果至少有10000个key
发生变化,则dump内存快照。AOF持久化配置在Redis的配置文件中存在三种同步方式,它们分别是:appendfsync alw
ays???? #每次有数据修改发生时都会写入AOF文件。appendfsync everysec? #每秒钟同步一次,该策略为A
OF的缺省策略。appendfsync no????????? #从不同步。高效但是数据不会被持久化。Redis主从复制当主从服务
器刚建立连接的时候,进行全量同步;全量复制结束后,进行增量复制。当然,如果有需要,slave 在任何时候都可以发起全量同步。注意:
master必须持久化,如果不进行持久化,当master宕机重启后,数据丢失,会将slave的数据清空。Master是从内存复制到
硬盘传给slave硬盘后,slave再从硬盘读取到内存中。主从复制,使用一主二从即可。主从复制配置Slave配置:1、修改redi
s.conf文件:设置从服务器:配置主服务器的ip和端口号:Master密码:从服务器默认只读:服务重启后,查看相关信息: /et
c/init.d/redis init_script stop /etc/init.d/redis init_script s
tartredis-cliauth 密码无磁盘化复制:(仍在测试阶段)repl-diskless-sync no  #默认no,修
改为yes,即开启无磁盘化复制repl-diskless-sync-delay 5 #同步前,等待时间,按秒计算。Redis缓存
过期机制主动-定期删除redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。Redi
s缓存过期:默认一秒钟检测10次。被动-惰性删除定期删除可能导致很多过期的key 到了时间并没有被删除掉。这时就要使用到惰性删除。
8种缓存淘汰策略Redis共提供了8种缓存淘汰策略,其中 volatile-lfu 和 allkeys-lfu 是Redis 4.
0版本新增的。1、noeviction:不进行淘汰数据。一旦缓存被写满,再有写请求进来,Redis就不再提供服务,而是直接返回错误
。Redis 用作缓存时,实际的数据集通常都是大于缓存容量的,总会有新的数据要写入缓存,这个策略本身不淘汰数据,也就不会腾出新的缓
存空间,我们不把它用在 Redis 缓存中。2、volatile-ttl:在设置了过期时间的键值对中,移除即将过期的键值对。3、v
olatile-random:在设置了过期时间的键值对中,随机移除某个键值对。4、volatile-lru:在设置了过期时间的键值
对中,移除最近最少使用的键值对。5、volatile-lfu:在设置了过期时间的键值对中,移除最近最不频繁使用的键值对6、allk
eys-random:在所有键值对中,随机移除某个key。7、allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。
allkeys-lfu:在所有的键值对中,移除最近最不频繁使用的键值对哨兵模式文件配置:整合后的文件:远程复制:Springboo
t集成redis哨兵模式集群:三主三从Redis.conf 文件修改:启动,查看进程imooc 为密码:输入yes 回车。查看某个
节点的信息:slots槽节点Springboot集成redis集群缓存穿透缓存穿透:是缓存中不存在才所查询的数据,直接请求数据库。
多次请求后,数据库崩溃。解决方案:1、不管所查询的数据是否存在,第一次查询数据库后,都将其放入缓存,并设置过期时间。2、布隆过滤器
。(太复杂)缓存雪崩缓存雪崩:同一时间多个key同时失效,大批量的访问直接访问数据库,导致数据库崩溃。Redis的批量查询mult
iGet/ 功能描述: 批量查询:实现命令 :mget @params @return / public List
mget(List keys){ return redisTemplate.opsForValu
e().multiGet(keys); }使用方法: / 功能描述: 批量查询 @params @return ja
va.util.List / @GetMapping("/mget") public Obj
ect mget(String... key){ List keysList = Arrays.asList(key); return redisOperator.mget(keysList); }管道pipeline / 功能描述: 批量查询:管道pipeline @params @return / public List batchGet(List keys){ List result = redisTemplate.executePipelined(new RedisCallback() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { StringRedisConnection src=(StringRedisConnection) connection; for (String k:keys){ src.get(k); } return null; } }); return result; }调用方法: / 功能描述: 批量查询 @params @return java.util.List / @GetMapping("/batchGet") public Object batchGet(String... key){ List keysList = Arrays.asList(key); return redisOperator.batchGet(keysList); }
献花(0)
+1
(本文系樱花梦_张艺...首藏)