Redis数据类型
有序集合。保留了集合不能有重复成员的特性,但是可以排序。它给每个元素设置了一个分数作为排序依据。有序集合提供了排序字段,但是也产生了代价,zadd的时间复杂度是O(log(n)),sadd的时间复杂度为O(1)。
编码方式采用ziplist和skiplist两种方式,在元素个数小于128同时每个元素都小于64个字节时,Redis会采用ziplist来实现。不满足时会采用skiplist来实现。
使用场景:有序结合比较典型的使用场景就是排行榜系统。比如获得多少个赞。
执行set命令会去掉过期时间。persist命令也可以将过期时间清除。
Redis不支持二级数据结构(例如哈希,列表)内部元素的过期功能,例如不能对列表类型的一个元素设置过期时间。
键迁移
键迁移是指将一个Redis上的数据迁移到另一个Redis上(从生产环境迁移到测试环境)。
move用于在Redis内部进行数据迁移,Redis内部可以有多个数据库。
dump+restore可以实现在不同的Redis实例之间进行数据迁移的功能。
在源Redis上,dump命令会将键值序列化,采用RDB格式。在目标Redis上,restore命令将上面序列化的值进行复原,其中ttl代表过期时间,ttl=0代表没有过期时间。
migrate也是用于在Redis实例间进行数据迁移的,实际上migrate命令就是将dump,restore,del三个命令进行组合,从而简化了操作流程。整个过程是原子执行的。目标redis完成restore后会发送ok给源redis。源redis接收后会根据migrate对应的选项来决定是否删除源redis对应的键。
遍历键
Redis提供了两个命令遍历所有的键,分别是keys和scan。keys命令是支持pattern匹配的。
当需要遍历所有键时(例如检测过期或限制时间,寻找大对象),keys是一个很有帮助的命令。如果key很多,有可能造成阻塞。
为了解决keys遍历阻塞的问题,可以使用Scan命令的渐进式遍历所有键。每次scan的时间复杂度是O(1),但是要真正实现keys的功能,需要多次执行scan。
Redis提供的面向哈希,集合,有序结合的扫描遍历命令,解决诸如hgetall,smembers,zrange可能产生的阻塞问题,对应的命令分别为hscan,sscan,zscan。
数据库管理
Redis提供了几个面向Redis数据库的操作,分别是dbsize,select,flushdb,flushall命令。
select dbIndex 切换数据库。一个实例下会有多个数据库存在,Redis默认配置中是有16个数据库。各个数据库之间的数据没有任何关联。
flushdb/flushall 命令用于清除数据库,两者的区别是flushdb只清除当前数据库,flushall会清除所有数据库。如果当前数据库键值数量比较多,flushdb/flushall存在阻塞Redis的可能性。
Redis的其他功能
慢查询分析
慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令记录下来。慢查询只统计命令执行时间,因为排队造成的客户端超时不计算在内。
获取慢查询日志
slowlog get [n]
每个慢查询日志由4个属性组成,分别是慢查询日志标识,发生时间戳,命令耗时,执行命令和参数。
slowlog len获取慢查询日志的长度。
slowlog reset,重置,实际上是对列表做清理。
Redis shell
redis cli --slave 选项是把当前客户端当成Redis的节点的从节点,可以用来获取当前Redis节点的更新操作。
redis cli --rdb rdb选项会请求Redis实例生成并发送RDB持久化文件,保存在本地,可使用它做持久化文件的定期备份。
redis cli --latency,latency有三个选项,分别是–latency,–latency -history,–latency -dist他们都可以检测网络延迟。
redis cli --stat 可以实时获取redis的重要统计信息。
redis -server 还有一个 --test-memory选项,这个选项可以用来检测当前操作系统能否稳定地分配指定容量的内存给redis(简单检测)。
redis -benchmark可以为Redis做基准性能测试。
-c 选项代表客户端的并发数量(默认是50)。
-n(num) 选项代表客户端的请求总量。
比如redis -benchmark -c 100 -n 20000代表100个客户端同时请求Redis,一共执行20000次,会给出性能指标。
Pipeline
批量命令操作。Pipeline可以将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。
Pipeline的执行速度一般比逐条执行要快。客户端和服务端的网络延迟越大,Pipeline的效果越明显。
事务
Redis提供了简单的事务功能,将一组要一起执行的命令放到multi和exec两个命令之间,multi代表开始,exec代表事务结束,命令时原子顺序执行的。命令并不一定执行了,只是被放到queue中。
Redis还提供了watch命令来确保事务中的key没有被其他客户端修改过,然后才执行,类似于乐观锁。Redis不支持事务回滚。
redis总可以使用eval和evalsha来执行Lua脚本。Lua脚本在Redis中是原子执行的,过程中不会插入其他命令。Lua可以帮助运维人员定制自己的命令,并可以将命令常驻在Redis内存中,实现复用。多条命令一次性打包,有效的减少网络开销。
Bitmaps
为了合理使用内存并提高开发效率,Redis提供了Bitmaps这个数据结构。Bitmaps本身不是一种数据结构,实际上就是字符串。可以想象成一个以位为单位的数组。
Bitmap在某些情况下可以节省很大的内存空间。
HyperLogLog
实际也是字符串类型。可以利用极小的内存空间完成独立总数的统计,数据集可以使IP,Email,ID等。HyperLogLog内存占用的非常小,但是存在错误率,开发者需要确定如下两条:
只是为了计算独立总数,不需要获取单条数据。
可以容忍一定的错误率。
Redis还支持发布订阅模式
Redis还提供了GEO(地理位置信息)功能,支持存储地理位置信息来实现诸如附近位置,摇一摇这样依赖地理位置的功能。
geoadd key longitude latitude member
longitude,latitude,member 分别是该地理位置的经度,维度,成员。
geoadd cities:locations 116.28 39.55 beijing //添加一个城市
geodist key member1 member2 [unit] //获取两个城市的距离