redis一般用法
安装略过
数据类型
key-value 存储系统,支持5种数据类型:
string 一个二进制安全的字节序列,最高512M字节数据.
常用命令: set/get (赋值/取值) ;decr/incr(自减/自增); mget(查询多个key)
例如: mget key1 key2 key3
hash 键值对集合,字符串字段与字符串值自减的映射
常用命令: hset/hget (赋值/取值) hgetall(查询所有字段和值)
例如:
hset car:1 name bmw hset car:1 color blue hset car:1 money 100 hget car:1 name hgetall car:1
list (列表类型) 字符串的有序可重复结构. 只能是字符串,不支持其他类型.
常用命令: lpush/rpush(列表头部添加元素/列表尾部添加元素) lpop/rpop(头部删除元素/尾部删除元素) lrange(查询元素)
例如: lrange key 0 3 // 查询key的第0位开始到第3位共4个值.
通常用来存储文章评论,用户粉丝列表,黑名单;消息队列等.
set (集合类型) 字符串的无序不重复结构. 有自动去重功能,可判断某个成员是否在一个set集合内(???).
常用命令: sadd/spop(添加/删除元素) smembers(查询) sunion (添加多个集合)sinter(求交集)
求两个用户的共同好友
zset(sortedset有序集合类型) 在set的基础上,为每个元素都关联了一个score,通过score实现排序功能.
常用命令 zadd/zrem(添加/删除) zrange(排序)/zcard
例如:
-- 添加 zadd tt 0 ms zadd tt 2 min zadd tt 1 s -- 排序,第0到2共3位 zrangebyscore tt 0 2
用于排序功能场景,实现文章点击量排序,热搜榜,论坛热帖等.
编码方式
raw
int
ht
zipmap
linkedlist
ziplist
intset
发布与订阅
目的:结构消息的发布者和接受者,在代码级别解耦,同时系统架构上解耦.redis作为发布订阅server,在订阅者和发布者之间起消息路由的作用.
例如
-- 发送消息 publish keymsg "aaaaaa" -- 订阅了keymsg消息的客户端都会收到该消息. subscribe keymsg
事务
目的: 保证同一个client发起的事务中的命令可以连续执行,而中间不会插入另一个客户端的命令.
当一个客户的发起事务命令
multi
时,这个链接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当次链接收到exec
命令后,redis才会顺序执行队列中的命令.然后将执行的所有命令结果一同返回到客户端.例如:
multi set money 100 incrby money 10 decrby mongy 5 get money exec
结果
OK (integer) 110 (integer) 105 "105"
管道
redis是一个支持请求/响应协议TCP服务器.一个请求到发送完成的步骤:
- client 发送一个查到服务器,并从套接字中读取信息.这个过程通常是在阻塞式地等待服务器响应,服务器处理命令并响应返回给客户端.
管道功能:客户端在同一个请求中可以同时发送多个命令,这个过程中无需等待每个命令的响应,而是在最后读取每个命令的响应回复.
分布式锁
- 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作,如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
地理信息
从Redis 3.2版本开始,新增了地理信息相关的命令,可以将用户给定的地理位置信息(经纬度)存储起来,并对这些信息进行操作。
持久化
将内存中的数据存放到磁盘中.
持久化方式:
RDB: 在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上.
AOF: 将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,从而恢复数据.
内存优化
用
info
查看统计信息,其中的内存memory
部分关键几点:used_memory_human : 以可读格式返回redis分配的内存总量.
used_memory_rss: 从操作系统的角度,返回redis已分配的内存总量.这个值和top命令输出一致.
used_memory_peak_human: 以可读格式返回redis的内存消耗
峰值
.
优化存储结构
正常情况下,hash中的value以hashmap方式存储,如果hashmap成员较少,或者hashmap的值长度较少,会以类似于线性压缩表的方式(ziplist)保存hash数据,该控制参数对应于redis配置文件中的两项:
hash-max-ziplist-entries 512 // hashmap内部成员不超过512用ziplist存储,大于512用hashmap hash-max-ziplist-value 64 // 长度不超过64时用ziplist,超过64用hashmap
其他的
list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-ziplist-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64
限制使用的最大内存
设置过期时间
EXPIRE key seconds
其他
配置,排序,集群部署,主从服之间的数据复制
常见应用问题
缓存穿透处理:什么是缓存穿透?当根据Redis key在缓存中查询后,不存在对应Value,就应该会在后端系统如DB中去查找,该Key的并发请求量一旦变大,那么就会对DB造成很大的压力。解决办法有:a.前端风险控制,将恶意穿透情况排除在外;b.对查询结果为空的情况依然进行缓存,但缓存时间会设置得很短,一般是几分钟。
缓存雪崩处理:什么是缓存雪崩?当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。解决办法有:后端连接数限制,错误阈值限制,超时处理,缓存失效时间均匀分布,前端永不失效及后端主动更新。
缓存时长:策略定位复杂,需要多维度的计算。
缓存失效:按时失效,事件失效,后端主动更新。
缓存Key:Hash、规则、前缀+Hash,异常情况可人工干预。
Lua脚本:服务端批量处理及事务能力,有条件逻辑的可扩展脚本。使用它的好处有:减少网络开销、原子操作、可复用。
Limit:可滑动时间窗口,如应用于Session,Memcached需每次传Key和Value。