Redis学习笔记

 
存储系统,按存储模型可分为:关系型数据库,KV存储,文档存储(如MongoDB),列式存储(HBASE)
国内常见KV系统有:Redis, tair, memcache
 

优缺点

redis优势
1、速度快(读写快,还可以快速处理排序等)
2、单个指令为原子操作(如rpush等操作,在传统系统中需要程序员自己实现原子性)
3、支持丰富的数据类型
4、持久化,主从备份,分区,事务,管道,pub/sub等特性
 
redis局限性:
1、不支持多指令事务
2、 可能丢数据(详见“Redis数据丢失分析”)

Redis数据结构

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
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 管道技术

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响

redis应用场景

1、会话缓存(最常用)
 
2、消息队列,比如支付
 
3、活动排行榜或计数
 
4、发布、订阅消息(消息通知)
 
5、最新商品列表、评论列表等 
 

Redis存储优化

 大key多key:

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

原文地址:https://www.cnblogs.com/night1989/p/10114207.html