本文共 3593 字,大约阅读时间需要 11 分钟。
Redis Sentinel是redis的一种高可用方案,可以实现监控、通知、自动故障转移、服务发现(通过哨兵发现master)
JedisSentinelPool
redis cluster
Redis Cluster 集群节点最小配置 6 个节点以上(3 主 3 从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
Redis Cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 16384个整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据。
高可用性:部分节点不可用时,集群仍可用。通过增加 Slave 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升;
使用jedis cluster可以操作redis集群,jedis只从master读数据,如果想自动读写分离,可以定制
4、使用redis repository,映射实体类加注解:@RedisHash(value="key",timeTolive=60)
5、通过定义名为redisCustomConversions的bean来定义redis的实体映射
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略:
1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 6. no-enviction(驱逐):禁止驱逐数据
以往你们使用Redis的String类型做的事,都可以用Memcached替换,以此换取更好的性能提升; 除此以外,优先考虑Redis;
1、Redis内存空间的利用比Memcahced更精细,引入Memcached是用一个“盒子”对数据进行承载,哪怕这个盒子的尺寸再合适,也不可避免的会有空置;
2、Memcached完美的解决了内存碎片的问题; 3、Memcached内部还存在一个slot的机制,对内存的使用优先使用废弃内存,在内存的重复利用上也具有一定的优势; 4、Redis并不是将所有内存数据都存放在内存中,只会将所有的key存放在内存,在读取的时候会有一定几率存在一次IO操作,在这一点上,Redis是使用时间换取了空间的策略;1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
redis缺点:
1 ,内存占用巨大
2 ,持久化并不一定是实时的,此时掉电或者其他故障可能会有大量的数据丢失3、没有事务机制
mysql 有几个好处: 1 ,内存占用相比 redis 小很多 2 , mysql 除了存储,还有 sql 这个强大的东西redis的 rehash包括了ing和ing两种方式
HashMap是一次性rehash
删除所有Key,可以使用Redis的flushdb和flushall命令
//删除当前数据库中的所有Keyflushdb//删除所有数据库中的keyflushall
如果要访问 Redis 中特定的数据库,使用下面的命令
//下面的命令指定数据序号为0,即默认数据库redis-cli -n 0 keys "*" | xargs redis-cli -n 0 del
如果要指定 Redis 数据库访问密码,使用下面的命令
redis-cli -a password keys "*" | xargs redis-cli -a password del
(1)基本事务:MULTI和EXEC、WATCH、DISCARD命令实现
被MULTI和EXEC命令包围的所有命令会一个接一个地执行,知道所有命令都执行完毕为止,当一个事务执行完毕之后,Redis才会处理其他客户端的命令。在用户使用WATCH命令对键进行监视之后,直到用户执行EXEC命令的这段时间里面,如果有其他客户端抢先对任何被监视的键进行了替换更新或者删除操作,那么用户尝试执行EXEC命令的时候,事务讲失败并返回一个错误。
事务中如果找不到某个命令,会当即报错回滚,如果命令执行失败,则忽略失败,提交其他成功的命令。
Redis事务是由流水下pipeline实现的
(2)在springboot中
第一种方式:redisTemplate设置开启事务,配合spring的@Transactional注解来使用
第二种方式:redisTemplate不显式开启事务,使用SessionCallback来手动实现事务
(3)非事务型流水线
使用非事务型流水线,在与redis的单次连接中执行多条命令。
在springboot中,使用redisTemplate的executePipelined(SessionCallback)来实现,与事务类似。
(1)记录最新日志
比如想记录用户最近一百条的浏览记录,可以使用如下方式:
127.0.0.1:6379> lpush recentlog message(integer) 7127.0.0.1:6379> ltrim recentlog 0 99
(2)计数器
string类型和hash类型都可以当做计数器
(3)分布式锁
第一种方式:setnx命令,轮询获取锁,超时失败。
第二种方式:redission客户端的RLock
redission的lock实现了Lock接口,功能更加丰富,并且支持可重入。底层是通过setnx、multi、exec等命令来实现的。并且通过pub/sub消息通知机制来减少线程的轮询和空转。
1、配置RedisCacheManager,添加注解@EnableCaching
2、使用Cacheable注解,该注解可继承,在接口方法添加注解,实现类可以继承
@Cacheable注解找到缓存就不会调用方法了,适合放在get方法上。
@CachePut方法不会检查缓存,而是调用方法更新缓存。适合放在save方法上。
@CacheEvict移除缓存,allEntries参数为true时,移除所有条目
#result.id 代表方法返回值的id属性
unless表达式为true时不会更新缓存
condition表达式为false时,禁用缓存
转载地址:http://dlbii.baihongyu.com/