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] 获取两个地理位置的距离

 

posted @ 2020-04-12 14:42  夏末秋凉  阅读(166)  评论(0编辑  收藏  举报