Redis
-
什么是Redis
Redis是一个用C语言开发的数据库,不过它是运行在内存上的,所以读写很快。在我自己的项目,只使用了Redis做缓存,但是没有使用它的其他功能。 -
其实分布式缓存的可选方案除了Redis还有Memcached。还是说需要对这个有一些了解的。文化软实力。简单说一下两者的区别。
共同点:
1. 都是基于内存的数据库。都被常用于缓存。
2. 都有过期策略
3. 效率都比较高
不同点:
1. Redis支持的数据类型更多(string,set,zset,list,hash,bimap,geograph)
2. Redis是支持数据持久化的,而Memchache不支持
3. Redis有灾难恢复机制
4. Memcache是多线程。而Redis是单线程的多路服用IO模式(这个Point) -
Redis的应用场景
- 分布式锁
- 消息队列
- 缓存
-
数据类型
-
String
- set key value
- get key
- exists
- strlen
- del
-
list
- rpush
- lpop
- lrange
-
hash
- hmset userInfoKey key value keyvalue
- hget userInfokey name
- hget userInfoKey age
- hvals
- hkeys
-
set 这个类似于Java中的HashSet。Redis中的set是一个无序集合
- 通过set可以查询到一个元素是否在这个集合中。
- sadd mySet value value2
- smembers mySet 查看set中的所有元素
- scard mySet 查看set的长度
- sismember 检查某一个元素是否存在在这个元素中
- sinterstore myset3 myset myset2查询myset和myset3中的元素放在myset3中
-
zset有序的set,通过一个score进行有序排列
- zadd myZset 30. value
- zadd myZset 2.0 value2 1.0 value3
就是进入zset的元素,自带一个权重,通过比较这个权重来计算这个元素在队列中的位置
-
bitmap
- bitmap存储的是连续的二进制数字。通过bitmap只需要一个bit就可以表示某一个元素的状态,key就是对应元素本身。比较节省空间
- setbit mykey 7 1
- setbit mykey 7 0
- getbit mykey 7
- setbit mykey 6 1
- setbit mykey 8 1
- bitCount 返回一个制定的key中位的值为1的个数
- 使用场景一:用户行为分析,很多网站为了分析你的喜欢,需要研究你点赞过的内容
setbit beauty_girl_001 uid 1 - 使用场景二:统计活跃用户,用时间为key用户id为offset,如果当日活跃过就设置为1
-
-
Redis的底层数据结构以及实现
- Redis底层的数结构
- 简单动态字符串
- 链表
- 字典
- 跳表
- 整数集合
- 压缩列表
- 字符串底层使用SDS简单动态字符串。好处是动态扩展
- 列表
- 数据量小的时候ziplist,压缩表是一块连续的存储空间,每一个节点有一个属性存储前一个节点的长度。
- 数据量多的时候会转换成链表LinkedList.
- 哈希
- 压缩列表ziplist(数据量小的时候)
- hashtable(底层用字典实现)
- 集合(set)
- intset,集合保存的对象都是整数,或者集合数据量比较小的时候
- hashtable,保存的不都是整数,或者数据量比较大的时候使用set
- 有序集合(zset)
- 数据量小的是压缩列表ziplist
- 数据量大的时候使用skiplist跳表完成
- Redis底层的数结构
-
Redis的单线程模型
Redis既然是单线程模式,那么是如何监听大量客户端的连接的,那就是通过IO多路服用技术。将引起Redis注意的事情注册到内核。观察他有没有被发生过。 -
布隆过滤器是,判断一个给定的数据是否存在于海量数据中的一个数据结构。
-
缓存雪崩指的是,一瞬间缓存大量失效,这样真是数据库就面临巨大的压力。比如过期时间设置不恰当就会造成这个问题。
-
Redis的内存淘汰机制
1. allkeys-lru 当内存不够的时候移除最近最少使用的key
2. volatile-lru 设置过期时间数据集,挑选最近最少使用的
3. volatile-random 从过期时间数据集中随机挑选淘汰
4. volatile-ttl 从设置了过期时间的数据集中挑选即将过期的淘汰
5. allkeys-random 随机淘汰
6. no-eviction禁止淘汰 -
Redis设置了两种数据持久化的方式
1. RDB是在制定时间间隔内生成数据集的时间点快照。因为记录的是整个数据的样子,所以耗时长,如果当做备份还行,如果做容灾备份就很难受。
2. AOF是持久化记录服务器执行所有写操作的命令。都是写在末尾的,所以比