目录
redis类型和对应的骚命令
-
string,带S的都是o(n)级的命令
-
mget,mset:可以执行批量命令操作,可以大大解决网络开销(每次命令都是一次网络请求,放在一起就变成一次了)S
-
getset :设置新的值返回老得值
-
append key value :把value追加旧值后面
-
strlen key : 返回你值的长度,注意中文值是占用2个字节(UTF-8),所以你要除2才能得出长度
-
incrbyfloat key value :浮点数的递增,但是没有递减,可以传个负数来达到递减的目的
-
getrange key 0 2 :获取索引范围内的key
-
setrange key 3 value :替换索引对应的值
-
incr ,decr :增1减1
- hash
- 可以想象他是mapmap结构,一个key里面放着类似map一样的健值对,可以单独的对他的value进行单独更新
- hget key field :获取hash key对应的field(列)的value
- hset key field value :设置hash key对应field的value
- hdel key field :删除hash key对应field的value
- hexists key field :判断hash key是否有field
- hlen key :获取hash key field的数量
- hmset,hmget:批量操作同理
- hgetall key :返回hash key对应所有的field和value S
- hvals key : 返回hash key对应所有的field的value S
- hkeys key :返回hash key 对应所有field S
- hsetnx key field value :同理
- hincrby key field intcounter :对应的列进行自增
- hincrbyfloat key field floatCounter :浮点数版本
- 和string比的优缺点,更直观,减小内存,达到要求会进行自动压缩数据,单独更新列避免程序内外反复的json序列化的开销,会造成编程复杂,只能控制key的失效时间,并不能精确到列
- list
- rpush key value..... :从列表右端插入值
- lpush key value.....: 送列表左端插入值
- linsert key before|after value newvalue:在list指定的值前|后插入newvalue S
- lpop :从左边弹出一个key
- rpop:从右边弹出一个key
- lrem key count value :根据count值,从列表中删除所有value相等的项 S
- ltrim :保留索引范围内的数据 S
- lrange key start end :获取列表指定索引范围所有值包含end S
- lindex key index :获取列表指定索引的item S
- llen key :获取列表的长度
- lset key index newvalue :设置列表指定索引值为newvalue S
- blpop key timeout :从左端等待队列返回值,timeout=0时候就死等
- brpop key timeout : 右侧版本
- set
- 无序且没有重复的支持集合间的操作
- sadd key element :向集合key添加element(如果存在,添加失败)
- srem key element :将集合key中的element移除掉
- scard :集合大小
- sismember :返回是否存在该元素
- srandmember key count:随意返回count个元素,不会减少集合数据
- smembers :返回所有元素
- spop key :从集合中随意弹出一个元素,会减少集合数据
- sdiff key key1:差集
- sinter key key1 :交集
- sunion key key1 :并集
- sdiff|sinter|suion + store destkey:将三种集结果保存在destkey中
- 有序set
- 有序且无重复元素,集合中element+score二个值,通过score来进行排序,有些命令时间复杂度很高,常用于排行榜
- zadd key score element :新增一个元素,分数score可以重复,element(值)不可以重复 o(log(n))
- zrem key element:删除元素,element可以是多个
- zscore key element :返回元素的分数
- zincrby key increscore element :增加或减少increscore个分数,传负数实现减少
- zcard key: 返回集合的长度
- zrange key start end [withscores] :返回指定索引范围内的升序元素,可选参数是否打印分值 o(log(n)+m)
- zrangebyscore key minscore maxscorep[withscores] :返回指定分数范围内的升序元素 o(log(n)+m)
- zcount key minscore maxscore :返回有序集合内在指定分数范围内的个数 o(log(n)+m)
- zremrangebyrank key start end : 删除指定排名内的升序元素
- zremrangebyscore key minscore maxscore :删除指定分数内的升序元素 o(log(n)+m)
- zrevarnk :获取指定元素的排名 从低到高
- zrevrange :同理,从高到低的排名
- zrevrangebyscore :通过分数获取从高到低的排名
- zinterstore,zunionstore:交集并集的计算
redis的另外一些骚操作
- 慢查询
- 慢查询会记录在一个大小固定的队列中
查询默认值的命令:
config get slowlog-max-len//队列长度为128
config get slowlog-log-slower-than //10000,超过10秒的会被记录
动态设置其大小的命令:
config set slowlog-max-len 1000 //常用长度
config set slowlog-log-slower-than 1000 //常用超时时间
慢查询命令
slowlog get[n]:获取慢查询队列N条
slowlog len : 获取慢查询队列的长度
slowlog reset :清空慢查询队列
- 流水线pipeline
- 把命令打包执行,解决每次网络请求的消耗,redis本身命令都是微秒级别的。
- 和mget,mset对比:pipelin是非原子的,执行的时候还是可能会被打乱分批执行,而mset是原子的,执行的时候就一个命令
- 注意每次pipeline携带的数据量
- pipeline每次只能作用在一个redis节点上
- 发布订阅
- publish channel message : channel为频道名,message 信息,发布消息,命令返回多个个订阅者
- subscribe[channel] :订阅频道 channel可以是一个或多个
- unsubscribe[channel] :取消订阅频道
- psubscribe[pattern....]:订阅模式,通过通配符来订阅多个频道
- punsubscribe[pattern.....]:退订指定的模式
- pubsub channels :列出至少有一个订阅者的频道
- pubsub numsub[channel....]:列出给定频道的订阅者数量
- 发布订阅和消息队列的区别:发布订阅是所有用户都能收到,而消息队列是所有用户只有一个用户收到,抢;
- 位图Bitmap
- 以极小的内存来统计网站访问次数等统计业务
- hyperloglog
- 极小的内存来进行独立总数统计
- pfadd key element [element....]:向hyperloglog添加元素 不会添加重复的element
- pfcount key [key.....]:计算hyperloglog的独立总数
- pfmerge destkey sourcekey[sourcekey.....]:合并多个hyperloglog
- 有容错率,为0.81%
- 无法取出单条数据
- GEO(3.2+版本)
- 用于通过经纬度来计算范围和距离
- geoadd cities:locations 116.28 39.55 bejing :新增方法
- geopos cities:locations bejing :获取地理位置信息
- geodist cities:locations tianjing bejing km :获取二个地理位置的距离,km千米,m米,mi英里,ft尺
- georadius :通过纬度可以计算范围
- 归属于有序集,可以使用有序集的删除key操作来删除一个位置
redis的持久化
- 异步的保存在硬盘之中
- 二种方式:
- 快照(RDB)
- 使用save命令直接生成RDB文件(二进制),同步命令故会阻塞整个redis。新的替换老得文件
- 使用bgsave命令异步生成RDB文件,通过fork()函数创建一个子进程来写文件,通常fork()函数都执行的比较快的,如果很慢也会阻塞一会,相比上面的命令这个会消耗内存
- 自动版(redis默认),通过生成策略来触发bgsave命令,可去配置文件查看(save 900 1:900秒变动一次)
一些配置文件参数
save 900 1 :900秒一次数据变动就会触发持久化操作
dbfilename dump.rdb :持久化文件的名称
dir ./ :文件存放的目录
stop-writes-on-bgsave-error yes :出现错误是否停止持久化
rdbcompression yes :是否采用压缩格式
rdbchecksum yes :是否对文件进行校验
最佳配置:
关闭自动持久化
dbfilename dump-${port}.rdb :用端口进行区分,因为redis是单核的单线程的,服务器部署多个redis可以方便利用多核优势
- 写日志(AOF)
- RDB耗时耗性能,出现宕机容易丢失数据。aof把命令刷新到缓冲区,然后通过下面三种策略来写到AOF日志文件中
- always:每条命令都写进去,不会丢失数据,但是IO开销很大,一般非固态的磁盘只有几百的TPS
- everysec(默认值):每秒写入到日志中,数据量高的时候适当的保护硬盘,会丢失一秒的数据
- no:由操作系统决定什么时候写入,不可控
- AOF重写:通过优化过期命令,多个命令合成来降低文件大小,提高恢复速度
- bgrewriteaof命令:通过fork子进程来重写AODF
- AOF重写配置参数
配置:
auto-aof-rewrite-min-size :aof文件重写需要的尺寸
auto-aof-rewrite-percentage :aof文件的增长率
统计:
aof_current_size :aof当前尺寸(单位,字节)
aof_base_size : aof上次启动和重写的尺寸(单位,字节)
触发重写触发时机:
当前尺寸大于最小尺寸
当前尺寸减去上一次重写的尺寸/上一次重写尺寸得到的就是增长率 大于配置的增长率
confg文件配置:
appendonly yes :打开重写
appendfilename :名称
appendfsync :刷新的策略