15.Redis
15.1 Redis String
15.1.1 删除 del key [key …]
首先我们设置一个键值
127.0.0.1:6379[1]> set w 20
OK
然后我们进行删除操作
127.0.0.1:6379[1]> del w
(integer) 1
找不到 w key w键成功删除
15.1.2 重命名 rename key newkey
我们继续使用键w
127.0.0.1:6379[1]> set w 20
OK
然后我们进行重命名操作
127.0.0.1:6379[1]> rename w h
OK
重命名成功
15.2 Hash
15.2.1 判断字段是否存在 hexists key field 返回hash里面field是否存在
首先设置多个值
127.0.0.1:6379[1]> hmset person name wang age 24 h 180 w 200
OK
判断
127.0.0.1:6379[1]> hexists person name
(integer) 1
127.0.0.1:6379[1]> hexists person hobby
(integer) 0
1 hash里面包含该field。
0 hash里面不包含该field或者key不存在
15.2.2 删除字段和值 hdel key field [field …]
我们依然以person为例
我们删除 h 和 w
127.0.0.1:6379[1]> hdel person h w
(integer) 2
我们看到已经把字段和值删除
15.2.3 返回字符长度 hstrlen key field
如果hash或者field不存在,返回0.
仍然以person为例
我们找到“wang”的长度
127.0.0.1:6379[1]> hstrlen person name
(integer) 4
15.3 List
ltrim key start stop 含义
修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。
首先我们设置一个list
127.0.0.1:6379[1]> lpush year 2002 2003 2004 2005 2006 2007 2008 2009 2010
(integer) 9
修建list
127.0.0.1:6379[1]> ltrim year 0 6
OK
此时,list已经被修剪删除了 key[8] 和 key[9]
我们再进行修剪
127.0.0.1:6379[1]> ltrim year 0 2
OK
此时list中只剩下三个键值
如果此时我们用比list大的范围进行修剪
127.0.0.1:6379[1]> ltrim year 0 5
OK
list没有任何变化
15.4 Set
返回集合中一个或多个元素的个数 srandmember key [count]
仅提供key参数,那么随机返回key集合中的一个元素.
Redis 2.6开始,可以接受 count 参数,如果count是整数且小于元素的个数,返回含有 count 个不同的元素的数组,如果count是个整数且大于集合中元素的个数时,仅返回整个集合的所有元素,当count是负数,则会返回一个包含count的绝对值的个数元素的数组,如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况.
仅提供key参数时,该命令作用类似于SPOP命令,不同的是SPOP命令会将被选择的随机元素从集合中移除,而SRANDMEMBER仅仅是返回该随记元素,而不做任何操作.
我们首先设置一个set
127.0.0.1:6379[1]> sadd name md modeng long song wang hell
(integer) 6
然后我们尝试返回随机个数
127.0.0.1:6379[1]> srandmember name 4
1) "hell"
2) "song"
3) "modeng"
4) "md"
127.0.0.1:6379[1]> srandmember name 4
1) "wang"
2) "song"
3) "modeng"
4) "long"
每一次都是随机取
15.5 面试题 RDB 和 AOF
15.5.1 RDB(Redis DataBase)
RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。
1.触发RDB快照
1 在指定的时间间隔内,执行指定次数的写操作
2 执行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (异步)命令
3 执行flushall 命令,清空数据库所有数据,意义不大。
4 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义…也不大。
2.通过RDB文件恢复数据
将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。在实际开发中,一般会考虑到物理机硬盘损坏情况,选择备份dump.rdb 。可以从下面的操作演示中可以体会到。
3.RDB 的优缺点
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。
15.5.2 AOF(Append Only File)
AOF :Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
1.触发AOF快照
根据配置文件触发,可以是每次执行触发,可以是每秒触发,可以不同步。
2.根据AOF文件恢复数据
正常情况下,将appendonly.aof 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。但在实际开发中,可能因为某些原因导致appendonly.aof 文件格式异常,从而导致数据还原失败,可以通过命令redis-check-aof --fix appendonly.aof 进行修复 。从下面的操作演示中体会。
3.AOF的重写机制
前面也说到了,AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多。所以聪明的 Redis 新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩。
重写的原理:Redis 会fork出一条新进程,读取内存中的数据,并重新写到一个临时文件中。并没有读取旧文件(你都那么大了,我还去读你??? o(゚Д゚)っ傻啊!)。最后替换旧的aof文件。
触发机制:当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。这里的“一倍”和“64M” 可以通过配置文件修改。
4.AOF 的优缺点
优点:数据的完整性和一致性更高
缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
15.5.3 总结
1.Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
2.RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
3.Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
4.AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
5.Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
6.若只打算用Redis 做缓存,可以关闭持久化。
7.若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。
参考
https://www.cnblogs.com/itdragon/p/7906481.html