Redis
Redis
Redis安装(docker版)
查看可用版本
1 | docker search redis |
拉取最新镜像
1 | docker pull redis:latest |
查看镜像
1 | docker images |
运行容器
1 | docker run -itd --name redis -p 6379:6379 redis |
- -p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。
安装成功
查看容器运行信息
1 | docker ps |
进入容器
1 | docker exec -it redis /bin/bash |
通过 redis-cli 连接测试使用 redis 服务及查看版本信息
1 | redis-cli |
常用5大数据类型
Redis键相关操作:
- keys *:查看当前库所有key,匹配key *1
- exists <key> [<key> …]:查看key是否存在,存在返回匹配的键个数,不存在返回0
- type <key>:查看key值的类型
- del <key>:删除指定的key数据
- unlink <key>:根据value选择非阻塞删除,仅将keys从keyspace元数据删除
- expire <key> second:给指定的key设置过期时间
- ttl <key>:查看还有多少秒过期,-1永不过期,-2已过期
- select index:切换数据库默认16个库,0~15
- dbsize:查看当前数据库key的数量
- flushdb:清空当前数据库
- flushall:清空所有数据库
String
set <key> <value> [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]:增加键值对,如果该key存在,则会覆盖value
NX:当数据库中不存在该key时,可以将key-value设置到数据库
XX:当数据库存在该key时,可以将key-value设置到数据库,与NX互斥
EX:key超时的秒数,与PX互斥,使用PX会覆盖该超时时间,-1:永不过期,-2:已过期
PX:key超时的毫秒数,与EX互斥,使用EX会覆盖该超时时间,-1:永不过期,-2:已过期
get <key>:获取key对应值
append <key> <value>:将value追加到key原本键值后,返回追加后value长度
strlen <key>:获取value的长度
setnx <key> <value>:只有当key不存在时,设置key-value,原子性操作,可用于实现分布式锁
incr <key>:将key中储存的数字值增1,只能对数字值操作,如果为空,新增值为1
decr <key>:将key中储存的值减1,只能对数字值操作,如果为空,新增值为-1
incrby <key> <increment>:将key中的数字增加指定步长
keys *:查看所有该数据库所有key
mset <key> <value> [<key> <value>]:同时设置多个key-value对
mget <key> [<key>]:同时获取多个value
msetnx <key> <value> [<key> <value>]:同时设置多个key-value对,当且仅当所有key不存在时才设置,原子性,有一个失败则都失败
getrange <key> start end:获取范围的值,类似subString,前包后包
setrange <key> <offset> <value>:用value覆写所储存的字符串值,从offset开始(索引从0开始)
setex <key> <second> <value>:设置键值的同时设置过期时间,单位秒
getset <key> <value>:设置新值的同时返回旧值
List
- lpush/rpush <key> <value> [<value>…]:从左边、右边插入一个或多个值
- lpop/rpop <key>:从左边、右边弹出一个值,值在键在,值光键亡
- rpoplpush <key> <key2>:从key1列表右边吐出一个值,插入到key2列表左边
- lrange <key> start stop:按照索引下标获取元素(从左往右),0 -1表示从头到尾
- lindex <key> <index>:按照索引下标获取元素(从左到右)
- llen <key>:获取列表长度
- linster <key> before|after <value> <newValue>:在value的后面|前面插入newValue
- lrem <key> <n> <value>:从左边删除n个value(从左到右)
- lset <key> <index> <value>:将列表key下标为index的值替换成value
Set
- sadd <key> <value> [<value>]:将一个或者多个元素加入到集合key中,已存在的元素将被忽略
- smembers <key>:取出该集合的所有元素
- sismember <key> <value>:判断集合key是否含有该value值,有返回1,没有返回0
- scard <key>:返回该集合的元素个数
- srem <key> <value> [<value>]:删除集合中的,某个元素
- spop <key> [count]:随机从该集合中吐出一个值,从集合中删除
- srandmember <key> [count]:随机从该集合中取出n个值。不会从集合中删除。
- smove <source> <destination> <value>:把集合中的一个值从一个集合移动到另外一个集合中
- sinter <key1> <key2> [<key3>…]:返回多个集合的交集元素
- sunion <key1> <key2> [<key3>…]:返回多个集合元素的并集元素
- sdiff <key1> <key2> [<key3>…]:返回多个集合的差集元素
Hash
hset <key> <field> <value> [filed value]:给key集合中的field属性设置值value
hget <key> <field>:从集合key中获取属性属性field的值
hmset <key> <field> <value> [filed value]:批量设置hash的值
hexists <key> <field>:查看哈希表key中的field属性是否存在,存在返回1,不存在返回0
hkeys <key>:列出该hash集合key的所有属性field
hvals <key>:列出该hash集合key的所有值value
hincrby <key> <field> <increment>:为hash表key中的属性field的值value加上增量increment,整数增加,负数减少
hsetnx <key> <field> <value>:将hash表key中的属性field设置值value,当且仅当该属性field不存在
Zset
- zadd <key> <score> <value> [score value …]:将一个或多个member元素及其score值加入到有序集合key中
- zrange <key> <start> <stop> [withscores]:返回有序集合key中,下标从start到stop之间的元素,带withscores,可以让分数和值一起返回到结果集,从小到大
- zrevrange <key> <start> <stop> [withscores]:返回有序集合key中,下标从start到stop之间的元素,带withscores,可以让分数和值一起返回到结果集,从大到小
- zrangebyscore <key> <min> <max> [withscores] [limit offset count]:返回有序集合key中,所有score值介于[min max]之间的成员, 有序成员按score值递增(从小到大)依次排序
- zrevrangebyscore <key> <max> <min> [withscores] [limit offset count]:同上,从大到小排序
- zincrby <key> <increment> <value>:为元素的score加上增量
- zrem <key> <value>:删除该集合下指定的元素
- zcount <key> <min> <max>:统计该集合,分数区间内的元素个数
- zrank <key> <value>:返回该值在集合中的排名,从0开始
数据结构
hash + 跳跃表
配置
bind 127.0.0.1:允许访问redis的ip地址
protected-mode yes:本机访问保护模式
需要支持远程连接要把bind 配置注释,protected-mode改为no
Redis的发布和订阅
发布
publish <channel> <message>
向不存在的频道发送消息会返回0,
订阅
subscribe <channel> [<channel>…]
可以订阅多个频道,频道在订阅的时候创建
Redis6 新数据类型
BitMaps
简介
- Bitmaps并不是一种数据类型,实际上就是字符串,但是它可以对字符串的位进行操作
- Bitmaps提供了一套单独的命令,所以在使用Bitmaps和使用字符串的方法不太相同,可以把BitMaps想象成一个以位为单位的数组,数组的每个单元只能储存0和1,数组的下标在Bitmaps中叫做偏移量
- 用途:,可以用来做签到统计,或者活跃用户统计,用户量越大,越节省空间,用户量不大可以选择set之类的
命令
setbit <key> <offset> <value>:设置Bitmaps中偏移量offset的 值,只能为0/1
getbit <key> <offset>:获取key的第offset位的值
bitcount <key> [<start> <end>]:统计值为1的字节个数
没有设置开始和结束时,统计从开始到结尾为1的数量
start为正数,end为正数时表示,统计从start到end位置值为1的个数
start为正数,end为负数时表示,统计从start到倒数end的位置值为1的个数
…
bitop <operation> <destkey> <key> [<key>…]:对多个Bitmaps集合进行操作并将结果保存到destkey中
operation:and(交集),or(并集),not(非),xor(异或)
Bitmaps与set对比
假设网站有1亿用户, 每天独立访问的用户有5千万, 如果每天用集合类型和Bitmaps分别存储活跃用户可以得到表
set和Bitmaps存储一天活跃用户对比 | |||
---|---|---|---|
数据类型 | 每个用户id占用空间 | 需要存储的用户量 | 全部内存量 |
集合类型 | 64位 | 50000000 | 64位*50000000 = 400MB |
Bitmaps | 1位 | 100000000 | 1位*100000000 = 12.5MB |
很明显, 这种情况下使用Bitmaps能节省很多的内存空间, 尤其是随着时间推移节省的内存还是非常可观的
set和Bitmaps存储独立用户空间对比 | |||
---|---|---|---|
数据类型 | 一天 | 一个月 | 一年 |
集合类型 | 400MB | 12GB | 144GB |
Bitmaps | 12.5MB | 375MB | 4.5GB |
但Bitmaps并不是万金油, 假如该网站每天的独立访问用户很少, 例如只有10万(大量的僵尸用户) , 那么两者的对比如下表所示, 很显然, 这时候使用Bitmaps就不太合适了, 因为基本上大部分位都是0。
set和Bitmaps存储一天活跃用户对比(独立用户比较少) | - | - | - |
---|---|---|---|
数据类型 | 每个userid占用空间 | 需要存储的用户量 | 全部内存量 |
集合类型 | 64位 | 100000 | 64位*100000 = 800KB |
Bitmaps | 1位 | 100000000 | 1位*100000000 = 12.5MB |