旅游网站课程设计,品牌网上授权,wordpress头条模板,wordpress 有广告插件下载一、什么是redis
Redis是一个NoSQL#xff08;非关系型数据库#xff09;数据库之一#xff0c;是一个用C语言开发的一个开源的高性能键值对(key-value)数据库或者说是一个缓存键值对数据库 #xff0c;用作数据库、缓存、消息中间件等。它支持多种数据结构#xff0c;包…一、什么是redis
Redis是一个NoSQL非关系型数据库数据库之一是一个用C语言开发的一个开源的高性能键值对(key-value)数据库或者说是一个缓存键值对数据库 用作数据库、缓存、消息中间件等。它支持多种数据结构包括字符串、哈希表、列表、集合、有序集合等并且支持丰富的操作命令如查找、插入、删除等。
1从Redis缓存中获取数据如果存在数据直接返回值。
2如果不存在执行数据库的查询方法
3将数据库中的值放入缓存并返回值
二、redis的优点
速度快因为数据存在内存中类似于HashMapHashMap的优势就是查找和操作的时间复杂度都是O(1) 支持丰富数据类型支持stringlistsetsorted sethash支持事务操作都是原子性所谓的原子性就是对数据的更改要么全部执行要么全部不执行 丰富的特性可用于缓存消息按key设置过期时间过期后将会自动删除。
三、redis的数据结构
五种数据类型String字符串、List列表、Set集合、Hash散列和 Zset有序集合
String可以是字符串、整数或者浮点数字符串最大支持512MB。对整个字符串或者字符串的其中一部分执行操作对象和浮点数执行自增(increment)或者自减(decrement) (使用场景缓存数据简单计数定期过时)List有序的字符串列表可以当做栈、队列或者阻塞队列使用。读取单个或者多个元素根据值来查找或者移除元素。 (使用场景用户排队有序消息)Set无序的字符串集合添加、获取、移除单个元素检查一个元素是否存在于某个集合中计算交集、并集、差集从集合里随机获取元素。 (使用场景去重交集并集差集获取随机数)Hash包含键值对的无序散列表。添加、获取、移除单个键值对获取所有键值对。 (使用场景同一资源的不同属性)Zset字符串成员(member)与浮点数分值(score)之间的有序映射元素的排列顺序由分值的大小决定添加、获取、删除单个元素根据分值范围(range)或者成员来获取元素。 (使用场景排行榜分数)
四、Redis的持久化功能
Redis是内存数据库如果不将内存中的数据库状态保存到磁盘上一旦服务器退出数据库状态约会消失。所以Redis提供了持久化功能。两种方式
RDB方式在指定的时间间隔内将内存中的数据集快照写入磁盘它恢复时是将快照文件直接读到内存里。AOF方式以独立日志的方式记录每次写命令重启时再重新执行AOF文件中的命令达到恢复数据的目的。
五、key过期后的回收删除策略
定时删除在设置键的过期时间的同时创建一个定时器让定时器在键的过期时间来临时立即执行对键的删除操作。惰性删除放任过期键不管每次从键空间中获取键时检查该键是否过期如果过期就删除该键如果没有过期就返回该键。定期删除每隔一段时间程序对数据库进行一次检查删除里面的过期键至于要删除哪些数据库的哪些过期键则由算法决定。
其中定时删除和定期删除为主动删除策略惰性删除为被动删除策略
六、逐出算法
Redis使用内存存储数据在执行每个命令前会调用freeMenoryNeeded()方法检测内存是否充足如果内存不满足新加入数据的最低存储要求redis要临时删除一些数据作为当前指令清理存储空间。
检查易失数据可能会过去的数据
volatile-lru挑选最近最少使用的数据淘汰volatile-lfu挑选最近使用次数最少的数据淘汰volatile-ttl挑选将要过期的数据淘汰volatile-random任意选择数据淘汰
检查全库数据
allkeys-lru挑选最近最少使用的数据淘汰allkeys-lfu挑选最近使用次数最少的数据淘汰allkeys-random任意选择数据淘汰
放弃数据驱逐
no-enviction禁止驱逐数据
七、redis常见问题的解决
1缓存预热
就是系统启动前提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候先查询数据库然后再将数据缓存的问题用户直接查询事先被预热的缓存数据
问题
请求数量较大数据吞吐量较大数据同步操作频率较高
解决方案
统计数据访问记录统计频率较高的热点数据
2缓存雪崩
缓存雪崩是指缓存同一时间大面积的失效所以所有的请求都会落到数据库上造成数据库短时间内承受大量请求而崩掉
解决方案
给不同的key的TTL 添加随机值利用redis集群提高服务的可用性给缓存业务添加降级限流策略给业务添加多级缓存
3缓存击穿
是指缓存中没有但数据库中有的数据一般是缓存时间到期这时由于并发用户特别多同时读缓存没读到数据又同时去数据库去取数据引起数据库压力瞬间增大造成过大压力。和缓存雪崩不同的是缓存击穿指并发查同一条数据缓存雪崩是不同数据都过期了很多数据都查不到从而查数据库。
解决方案
互斥锁用互斥锁缓存失效的时候先去获得锁得到锁了再去请求数据库。没得到锁则休眠一段时间重试。逻辑过期方案 用户查询某个热门产品信息如果缓存未命中(即信息为空)则直接返回空不去查询数据库。如果缓存信息命中则判断是否逻辑过期未过期返回缓存信息过期则重建缓存尝试获得互斥锁获取失败则直接返回已过期缓存数据获取成功则开启独立线程去重构缓存然后直接返回旧的缓存信息重构完成之后就释放互斥锁。 只要命中了缓存无论是否过期是否获得锁看都返回同一个缓存信息。
4缓存穿透
是指缓存和数据库中都没有的数据导致所有的请求都落到数据库上造成数据库短时间内承受大量请求而崩掉。
解决方案
缓存空对象请求的数据即使不存在也存进redis内存中 简单易维护布隆过滤将数据库中所有的查询条件放入布隆过滤器中当一个查询请求过来时先经过布隆过滤器进行查如果判断请求查询值存在则继续查如果判断请求查询不存在直接丢弃。
八、Redis的模板类
Redis的模板类是一种封装了常用 Redis 操作的类它可以简化 Redis 操作的代码并提高代码的可读性。通常情况下使用 Redis 的模板类可以避免在代码中直接使用 Redis 命令而是使用预定义的方法。redis提供了两种模板类
RedisTemplate模板类存时先将数据先序列化成字节数组再存入Redis。
StringRedisTemplate模板类继承自RedisTemplate存时先将数据先序列化成字符串再存入Redis。
两者的区别
1两者数据各自存各自取数据不互通
RedisTemplate存入数据后key与value在Redis中均变为了字节数组。那么如果使用StringRedisTemplate以相同的key去Redis中查询会查询不到该key则会报null。StringRedisTemplate存入数据后key与value在Redis中均为可读数据。那么如果使用RedisTemplate以相同key去Redus中查询key变为了字节数组的形式查询不到该字节数组形式的key则会报null。
2序列化策略不同
RedisTemplate采用JDK的序列化策略StringRedisTemplate采用String的序列化策略 八、Redis的应用场景
缓存 作为Key-Value形态的内存数据库Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数据非常简单只需要通过string类型将序列化后的对象存起来即可。数据共享数据共享分布式String 类型因为 Redis 是分布式的独立服务可以在多个应用之间共享 计数器在 Redis 的数据结构中string、hash和sorted set都提供了incr方法用于原子性的自增操作。时间轴list作为双向链表不光可以作为队列使用。如果将它用作栈便可以成为一个公用的时间轴。当用户发完微博后都通过lpush将它存放在一个 key 为LATEST_WEIBO的list中之后便可以通过lrange取出当前最新的微博。抽奖利用set结构的无序性,通过 Spop Redis Spop 命令用于移除集合中的指定 key 的一个或多个随机元素移除后会返回移除的元素。 随机获得值。