基本认识
image.png数据类型
-
String
Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.
常用命令: set,get,decr,incr,mget 等。 -
hash
常用命令:hget,hset,hgetall 等。
直接存储对象,使用string数据类型会产生序列化/反序列化的开销 -
List
常用命令:lpush,rpush,lpop,rpop,lrange等。
实现为双向链表,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现
,消息队列 -
Set集合
常用命令:sadd,spop,smembers,sunion 等。
value为null和hashMap来实现,Sets 集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作 -
Sorted Set
常用命令:zadd,zrange,zrem,zcard等
Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。另外还可以用Sorted Sets来做带权重的队列 -
Pub/Sub
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个 key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。
应用场景
-
计数
-
缓存
-
队列 List+Pop
4.发布订阅:Pub/Sub
-
显示最新的项目列表: List
-
排行榜相关: SortSet
-
按照用户投票和时间排序: List + SortSet 配合使用
例如首页上的1000条新闻都是候选者,因此我们先忽视掉其他的,这实现起来很简单。每次新的新闻贴上来后,我们将ID添加到列表中,使用LPUSH + LTRIM,确保只取出最新的1000条项目。有一项后台任务获取这个列表,并且持续的计算这1000条新闻中每条新闻的最终得分。计算结果由ZADD命令按照新的顺序填充生成列表,老新闻则被清除。 -
处理过期项目
每次有新项目添加到我们的非Redis数据库时,我们把它加入到排序集合中。这时我们用的是时间属性,current_time和time_to_live。另一项后台任务使用ZRANGE…SCORES查询排序集合,取出最新的10个项目。如果发现unix时间已经过期,则在数据库中删除条目。 -
特定时间内的特定项目
另一项对于其他数据库很难,但Redis做起来却轻而易举的事就是统计在某段特点时间里有多少特定用户访问了某个特定资源。比如我想要知道某些特定的注册用户或IP地址,他们到底有多少访问了某篇文章。
SADD page:day1:
缓存问题
-
缓存穿透
key对应的数据在数据源并不存在,大量不存在的key去请求db,从而可能压垮db
解决方案:
1.bloomfilter过滤
2.空key设置null值,外加短时间的过期世纪 -
缓存雪崩
热点数据在同一时间段缓存集体失效,但是下一轮多个热点数据key并发请求,全部击中db。
解决方案:缓存时间根据业务需求进行随机分布,避免大量数据同时失效 -
缓存击穿
单个key失效,之后针对这个key进行高并发请求,击中db
解决方案:
1.热点key永不过期
2.mutex互斥锁,仅允许一个线程进行查询db,更新缓存 -
并发设置Key
多个redis的client同时set key引起的并发问题
解决方案:
1.分布式锁
2.消息队列
3.消息体存入时间戳,然后由各个客户端根据时间进行判断
持久化
RDB:fork一个子进程在内存中的数据库记录定时dump到磁盘上的RDB持久化
AOF:追加日志的方式持久化
网友评论