Redis
Redis是一款基于c语言编写的高性能nosql,可基于内存亦可持久化的日志型、key-value数据库,可以用作数据 库,缓存 ,消息中间件,并且有丰富的数据类型,也是目前缓存技术解决方案之一。
1.数据类型
1.1 String
字符串类型是redis中最为基础的数据存储类型,该类可以接受任何格式的数据,其中value最多可以容纳数据长度512M
-
设置键值
set key value
set name itboy
-
设置键值及过期时间,以秒为单位
setex key seconds value
setex name 3 itboy #三秒后这个value就过期啦
-
设置多个值
mset key1 value1 key2 value2 key3 value3...
mset name itboy age 18 gender male
-
追加值
append key value
append name cc #指定key 对应的value后面加值
-
获取
get key
获取多个mget key1 key2 key3
get name mget name age gender
-
删除
del key1 key2
del name age
1.2 键命令
-
查找键 支持正则表达式
keys pattern
参数支持正则表达试h?llo #匹配 hello, hallo 和 hxllo h*llo #匹配 hllo 和 heeeello h[ae]llo #匹配 hello 和 hallo, 但是不匹配 hillo h[^e]llo #匹配 hallo, hbllo, … 但是不匹配 hello h[a-b]llo #匹配 hallo 和 hbllo
-
查看所有键
keys *
-
判断键是否存在,如果存在返回1,不存大返回 0
exists key
-
查询健的类型
type key
type name
-
设置过期时间 ,以秒为单位
expire key seconds
expire name 2
-
查看有效时间 以秒为单位
ttl key
ttl name
1.3 Hash
-
hash 用于存储对象,对象的结构为属性、值
-
值的类型为String
-
设置单个属性
hset key field value
hset user name cc hget user name #获取
-
设置多个属性
hset key field1 value1 field2 value2......
hset user name cc age 18
-
获取指定键的所有属性
hkeys key
hkeys user
-
获取多个属性的值
hmget key field1 field2
hmget user name age
-
获取所有属性的值
havls key
-
删除
-
删除属性,属性对应的值 也会被删除
hdel user hdel user name
-
-
1.4 list
-
列表的元素类型为string
-
按照插入顺序排序
-
左侧插入数据
lpush key value1 value2...
lpush a1 a b c
-
右侧插入数据
rpush key value1 value2...
rpush a1 0 1 2
-
指定元素的前后插入新元素
linsert key before或者after 现有的元素 新元素 linsert a1 before 1 a # 在键为a1 的列表元素1前面添加a
-
获取
-
返回列表里指定范围内的元素
-
索引是左侧开始,第一个元素为0
-
索引可以是负数,表示从尾部开始计数,-1表示最后一个
lrange a1 0 -1 #获取键a1 所有元素
-
-
指定索引位置的元素值
lset key index value lset a1 0 b
-
删除指定元素
-
将列表中前count次出现的值为value的元素移除
-
count > 0: 从头往尾移除
-
count < 0: 从尾往头移除
-
count = 0: 移除所有
lpush a3 a b a b c b a b a lrem a3 -3 a abbcbb
-
-
1.5 set
-
无序集合
-
元素为string 类型
-
元素具有唯 一性,不重复
-
添加元素
sadd key member1 mebmer2
sadd aa a b c
-
获取
smembers key #返回所有的 smembers aa #获取键aa的所有元素
-
删除
srem key srem aa #删除键aa的所有元素 sream aa a #删除键aa中的a元素
-
1.5 zset
-
sorted set 有序集合
-
元素为string 类型
-
元素具有唯一性 不重得
-
每个元素都会关联一个double类型的score,表示 权重,通过 权重将元素从小到大排序
-
没有修改操作
-
添加
zadd key score1 member1 score2 member2
zadd name 1 a 2 b 3 c 4 d
-
获取
zrange key start top
zrange name 0 -1 #获取键name 所有元素 zrangebyscore key min max #返回score值 在min 和max之间的成员
-
删除
zrem key member1 mermber2
zrem name a zremrangebyscore key min max #删除权重在指定范围的元素
-
2.数据持久化
持久化主要是做灾难恢复,数据恢复,比如redis挂了,导致redis不可用的,大量请求全部落在db上,导致db沉重崩溃,这时候 要做的事情 尽快让reids变得可用,尽快让他对外提供服务,之前就应该做好数据持久 化,重启redis之后,通过备份数据,快速恢复,一量恢复就对外提供 服务
-
reids持久化: RDB,AOF
-
RDB:RDB持久化机制,对redis的数据执行周期性的持久化,redis主进程会fork一个子进程 ,让子进程 执行磁盘IO操作进行RDB持久化即可,即在指定目录生一个dump.rdb文件,redis重启会通过 加载dump.rdb文件恢复数据
优点:
- RDB会生成多个数据文件,每个数据文件都代表某一个时刻中redis数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整数据文件存储云服务器上。
- RDB对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程 ,让子进程 进行磁盘IO操作进行持久化。
- 相对AOF持久化机制来说,RDB数据文件来重启和恢复数据,更加快速。
缺点
- 如果想在要redis故障时,尽可能少丢失数据,那么RDB没有AOF好,RDB是每隔一段时间生成一次,如果这个时候 redis宕机啦,那么会丢失 最近这段时间的数据
- RDB每次在fork子进程来执行RDB快照文件生成的时候,如果数据文件特别大,可能 导致客户端提供的服务暂停毫秒或者甚至数秒
-
AOF:AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中。
优点:
- 相对RDB而言,AOF可以更好的保护数据不丢失,一般AOF会每隔一秒,能过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据
- AOF日志文件以
append-only
模式写入,所以没有任务磁盘寻址的开销,写入性能非常高,而且 文件不容易破损即使文件尾部破损,也很容易恢复 - AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
缺点:
- AOF的文件会越来越大,提供了AOF文件越大的解决方案,redis会自动重新根据当前的redis内存中的数据给生成一个新的最小写操作的AOF文件
- AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
RDB和AOF到底该如何选择
(1)不要仅仅使用RDB,因为那样会导致你丢失很多数据
(2)也不要仅仅使用AOF,因为那样有两个问题,第一,你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快; 第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug
方案,redis会自动重新根据当前的redis内存中的数据给生成一个新的最小写操作的AOF文件
2. AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
RDB和AOF到底该如何选择
(1)不要仅仅使用RDB,因为那样会导致你丢失很多数据
(2)也不要仅仅使用AOF,因为那样有两个问题,第一,你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快; 第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug
(3)综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复