优缺点
Redis数据结构
String(字符串)
|
二进制安全
|
可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M
|
普通kv存储 |
Hash(字典)
|
键值对集合。Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
|
适合存储对象,并且可以只读取或修改某一项属性值。
但hgetall涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应
|
对象
|
List(列表)
|
链表(双向链表)
|
增删快,提供了操作某一段元素的API
|
1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
|
Set(集合)
|
哈希表实现,元素不重复。
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的
|
1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作。
|
1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
|
Sorted Set(有序集合)
|
将Set中的元素增加一个权重参数score,元素按score有序排列
|
数据插入集合时,已经进行天然排序
|
以某个条件为权重,比如按点赞的次数排序.
|
Redis持久化
摘自:https://blog.csdn.net/weiwenjuan0923/article/details/52886931
redis是持久化的内存数据库。把内存中的数据保存到磁盘来保证持久化。持久化的目的是重启后恢复数据。
RDB是Snapshot快照存储,半持久化模式
按周期策将数据保持在磁盘(save来定义周期),借助fork命令的copy on write机制。
生成快照时,当前进程会fork一个子进程,然后再子进程中循环所有数据,当数据携程rdb文件
RDB没有刷写模式,rdb文件中保存的不是最新的,从上次rdb文件生成到redis停机的时间的数据丢失
AOF是完全持久化存储 append only file
压缩持久化文件,bgwriteaof命令重新生成aof文件。
恢复数据时,会重新执行文件中的命令在内存中重建整个数据内容
Redis事务
Redis 管道技术
redis应用场景
Redis存储优化
1: 单个简单的key存储的value很大
2: hash, set,zset,list 中存储过多的元素(以万为单位)
3:一个集群存储了上亿的key
Redis是单线程模式,大key导致单个操作阻塞时间长;多key导致过多内存空间占用。
大value拆分
可以尝试将对象分拆成多个key-value,也可以将这个存储在一个hash中,每个field代表一个具体的属性。
对于只需读写部分数据的情况,减少操作数据量;对于用mget全量读取的情况,将操作压力平摊到多个redis实例中,降低对单个redis的IO影响。
大集合拆分
类似于大value的拆分。对集合中元素进行分桶,拆分到多个key(类似关系数据库的横向分表)
key过多
减少key的个数可以减少内存消耗,可以参考的方案是转Hash结构存储,即原先是直接使用Redis String 的结构存储,现在将多个key存储在一个Hash结构中。
如果key之间有相关性,可以多个key整合成一个对象,把key映射为对象属性,用hash存储;
如果key之间是平行的,可以对key进行分桶,一个桶是一个hash