定义与基本信息
Redis官网:https://redis.io
NoSQL型数据库,以key,value的形式存储数据
Redis可实现一秒写8万次,读11万次,将所有数据都放在内存中,读写都在一个CPU上,是单线程的
共16个数据库,默认使用第0个
默认端口:6379
数据类型
五种基本数据类型:
String, List, Set, Hash, ZSet
三种特殊数据类型:
Geospatial, Hyperloglog, Bitmap
作用
数据库,缓存,MQ
基本数据类型常用命令
连接redis
redis-cli -h host -p port -a password
String类型命令
# 设置键值对
SET key value
# 获取键值对
GET key value
# set if not exists
SETNX key value
# set with expire
SETEX key time value
List类型命令
list相当于一个双端队列
# 将一个值或多个值,插入到列表头部
LPUSH key value
LPUSH key value1
LPUSH key value2
# 获取list,包含指定区间的值
LRANGE key start end
# 将一个值插入到列表尾部
RPUSH key value3
# 获取列表长度
LLEN key
# 移除列表中指定个数的值, 以下例子移除了key中count个value
LREM key count value
# 将列表中指定下表值替换成另一个值
LSET key index value
# 将值插入到列表当中,位于值pivot之前或之后
LINSERT key BEFORE|AFTER pivot value
set类型命令
此类型中不能出现重复的value
通过哈希表实现,添加,删除,查找的复杂度都是 O(1)
# 添加键值对
SADD key value
# 返回set中所有的成员
SMEMBERS key
# 判断成员value是否是set中的值
SISMEMBER key value
# 获取成员个数
SCARD key value
# 移除set中指定成员
SREM key value
# 随机抽选成员
SRANDMEMBER key
# 两个set的差集
SDIFF key1 key2
# 两个set的交集
SINTER key1 key2
# 两个set的并集
SUNION key1 key2
Hash类型命令
相当于Map集合,key-map对应,本质和String类型没有太大差异,map在redis中表示为一个field(字段)
# 将key中的字段field的值设为value
HSET key field value
# 同时设置key中多个字段的多个值
HMSET key field1 value1 field2 value2
# 获取key中field1字段的值
HGET key field1
# 获取key中field1和field2的值
HMGET key field1 field2
# 以列表形式返回哈希表的字段及字段值
HGETALL key
# 获取key中所有的值
HVALS key
# 为key中的指定字段的整数值加上增量increment
HINCRBY key field increment
ZSet类型命令
有序集合,sorted set
ZSet中不允许出现重复的值,每个成员都会关联一个double类型的分数,所以可以排序
# 向有序集合添加一个或多个成员
ZADD key score1 member1 score2 member2
# 获取成员数量
ZCARD key
# 获取分数在min和max之间的成员,升序排列
ZRANGEBYSCORE key min max
# 获取分数在min和max之间的成员,降序排列
ZREVRANGEBYSCORE key max min
# 移除有序集合中给定的分数区间的所有成员
ZREMRANGEBYSCORE key min max
# 通过字典区间返回有序集合的成员
ZRANGEBYLEX key min max
不常用数据类型介绍
Geospatial
一般用于计算地理位置之间的距离,需存储经纬度信息和名称(GEOADD),利用命令(GEODIST)可返回两地之间的距离。
Hyperloglog
基数统计,返回集合中不重复的元素。
只计算基数,不存储元素。
Bitmap
位存储,用一个bit位来标记某个元素对应的Value,Key表示该元素,节省存储空间。
应用:统计信息
Redis事务
MULTI
标志着一个事务的开始,redis将后续的命令放入队列中,保证原子性。
EXEC
执行一个事务队列中的所有命令
DISCARD
清除一个事务队列中的所有命令
WATCH
监视某个事务(在事务需按条件执行时),设置在给定的key上
UNWATCH
取消 WATCH 命令对所有 key 的监视
数据持久化的两种方式
RDB
Redis Database
在指定的时间间隔内将内存中的数据集快照(snapshot)写入磁盘
实现
单独创建一个子进程(fork)进行持久化,写入一个临时文件(dump.rdb),待持久化过程结束,再用这个临时文件替换上次持久化好的文件
触发机制
- save规则,指定当m秒内发生n次变化时,会触发bgsave
- flushall
- 退出redis
优点
- 适合大规模数据恢复
- 对数据完整性要求不高
缺点
- 需要一定时间间隔操作,如果redis意外宕机,最近修改的数据丢失
- fork进程会占用一定空间
AOF
Append-only File
将所有命令都记录下来(appendonly.aof),默认不开启,如需开启则将appendonly改为yes,重启redis生效
优点
- 每一次修改都同步,文件的完整性提高,保护数据不丢失
- 写入性能比较好
缺点
- AOF日志文件通常比RDB数据快照文件大,恢复速度慢
- 运行效率低
缓存穿透、击穿、雪崩
缓存穿透
定义:用户不断发起请求,而缓存和数据库中都没有该数据,导致数据库压力过大
解决方案:增加校验
缓存击穿
定义:在高并发的情况下,用户集体取数据,缓存中一条数据时间到期,只能同时去数据库中取,导致数据库压力过大
解决方案:加互斥锁,设置缓存不过期
缓存雪崩
定义:缓存中数据大批量到过期时间,很多数据都查询不到,只能去数据库中取,导致数据库压力过大
解决方案:缓存过期时间随机设置或设置缓存不过期,将数据放在不同数据库中