Redis初识
Redis是开源的基于键值对的服务,拥有多种数据结构,性能高。
启动方法
- 最简启动 redis-server
- 动态参数启动 redis-server --port 6380
- 配置文件启动 redis-server configPath
验证方式
ps -ef | grep redis netstat -antp | grep redis redis-cli -h ip -p port ping
建议使用配置文件方式启动,因为redis单线程模型,服务器多核,可能一台配置多个redis,可以使用多实例配置文件的方式启动,通过端口号区分开。
Redis 客户端
redis-cli -h ip -p port
状态回复 ping-->ping
错误回复
整数回复redis-cli
字符串回复/多行字符串回复
常用配置
daemonize 是否是守护进程启动,默认是no,建议yes,启动日志会打印到日志当中。
port 端口,单机多实例的时候必须配置。
logfile 日志文件名,只是文件名
dir redis工作目录,日志文件以及持久化文件的存储目录
config get *
可以看到配置的参数是非常多的,RDB,AOF,慢查询,内存管理的配置后面再写。
通用命令
keys ,dbsize 多少个key O(1) , exists key ,expire key seconds 过期 ttl查看剩余时间 persist 去掉过期时间,del key 删除,type key 返回类型 。
Redis是单线程一次只运行一条命令,因拒绝长命令 keys,flushall,flushdb,slow lua script,muti/exec,不过在fysnc /close file descriptor 时不是单线程。
单线程还这么快主要是因为
- 纯内存
- 非阻塞IO
- 避免线程切换和竞态消耗
五大类型
string,hash,list,set,zset,nil
字符串
如上图所示,字符串,他可以是字符串,整数,二进制(位图)。字符串大小限制在512M。一般建议在100k以内。
场景 缓存、计数器、分布式锁等
API:
get,set,del
incr,decr,incrby,decrby 对整数加减
mget,mset 一次网络时间,n次命令时间
getrange 获取范围
Hash
field:value field不能相同,所有的命令都是h开头,hash对应某个field是无法设置过期的。
API:
hset key field value
hget key field value
hdel key field
hmget hmset
hlen hexists
记录每个用户页面访问量。
List
所有命令都是L开头,lpush,rpush,lpop,rpop, linsert,llen
lrem list count value (从左边删除 count个 value)
ltrim list start end 按范围修剪列表
lrange list start end 获取范围 包含end
lindex list index 按索引获取
lset list index newValue 设置
blpop,brpop 阻塞插入弹出
LRUSH + LPOP = Stack
LPUSH + RPOP = Queue
LPUSH + LTRIM = 固定大小的列表
LPUSH + BRPOP = 消息队列
SET
无序,无重复,集合间操作,操作以S开头
sadd,sinter,sdiff,sunion
scard 计算集合大小
sismember 判断是否在集合中
srandmember 从集合中随机选择挑几个
spop 随机弹出一个
smembers 取出所有元素,无序,慎重使用,可能造成阻塞。
SADD 标签
SPOP/SRANDMEMBER 随机比如抽奖
SADD +SINTER 社交相关的 共同好友之类的
ZSET
api以Z开头,有序集合,时间复杂度肯定要比集合高了。
zadd key score element, 分数是可以重复的,元素是不可重复的 log(n)
zrem key element 删除元素 O(1)
zscore key element 获取element的分数
zincrby key increScore element 增加元素分数
zcard 返回元素的个数
zrank 从小到大
zrange key start end (with scores)和 lrange类似 O(log(n) + m ) 按排名
zrangebyscore key minScore maxScore 指定分数范围内的升序元素
zcount key minScore maxScore 分数范围内人数
zremrangebyrank 按照rank范围 进行删除
zrevrank,zrevrangebyscore,zrevrange, 这里是从高到低的排名
zinterstore,zunionstore 交集和并集
可以用于排行榜
其他功能
慢查询
如keys * , hgetall, 客户端超时不一定是慢查询,慢查询可能会导致客户端超时
两个配置
1. slowlog-max-len 先进先出的队列,固定长度,保存在内存中,默认值128,不要设置过小,通常设置1000
2. slowlog-log-slower-than 微妙,阈值执行时间, 设置小于0 不记录任何命令 默认10000微妙 10毫秒,通常设置1ms,因为redis qps是万级别的,平均是0.1ms,如果设置的过大,对qps会有影响,这个要根据实际的qps来处理。
需要定期持久化慢查询,redis重启后会清空,持久化后可以查询历史问题
可以通过修改配置文件重启和 config set slowlog-max-len 动态配置两种方式
slowlog get[n] 获取慢查询队列, slowlog len 获取长度 slowlog reset 清空
pipeline
批量操作,一次网络时间+n次命令时间。Redis的命令时间是微妙级别,通过pipline可以减少多次操作的时候,网络的时间。
发布订阅
发布,所有的订阅者都会收到。如果只有一个收到则是消息队列
redis无法做消息堆积,publish,subscribe,unsubscribe
publish channel message
subscribe channel #一个或多个
bitmap 位图
可以操作位
get/setbit ,
bitcount 获取位图指定范围位置为1的个数,不带参数就是获取全部
bitop op key 两个位图交并
bitpos key targetBit 计算位图指定范围第一个偏移量对应的值等于targetBit的位置
比如独立用户通知,1亿用户用bitmap存储 12.5MB
bitmap是string类型,最大512M,也不是绝对的好
hyperloglog
HyerLogLog和bitmap一样是String类型,基于HyperLogLog算法用极小空间完成独立数量的统计,但是错误率是0.81%。
三个命令
pfadd key element 添加元素
pfcount key 计算独立总数
pfmerge destkey sourcekey [sourcekey...] 合并多个hyperloglog
GEO
经纬度,添加地理位置,类型为zset
geoadd key longitude latitude member 添加经纬度
geopos key member 获取经纬度
geodist key member1 member2 [unit] 获取两个地理位置的距离