通用命令
127.0.0.1:6379> keys * #查看本数据库所有数据
1) "views"
2) "age"
3) "key1"
127.0.0.1:6379> select 3 #切换数据库
OK
############################################
127.0.0.1:6379> dbsize #本数据库数据量大小
(integer) 0
############################################
127.0.0.1:6379> flushdb #清空当前数据库数据
127.0.0.1:6379> flushall #清空所有数据库数据
############################################
# 127.0.0.1:6379> config get requirepass #获取密码
# 127.0.0.1:6379> config set requirepass "123325" #设置密码
# 127.0.0.1:6379> auth 123456 #若设置了密码,则需要先登录才能操作数据
# 127.0.0.1:6379> save #命令保存配置
# 127.0.0.1:6379> shutdown #关闭数据库
String常用命令
127.0.0.1:6379> set views 0 #设置字符串,set key value
"0"
127.0.0.1:6379> INCR views 5 #自增5,默认自增1,可用于访问量计数
(integer) 1
127.0.0.1:6379> get views #获取key的值
"5"
127.0.0.1:6379> DECR views 5 #自减5,默认自减1
(integer) 1
127.0.0.1:6379> get views
"0"
############################################
127.0.0.1:6379> get age
"1"
127.0.0.1:6379> APPEND age hello #追加字符串,如果age不存在就相当于set操作
(integer) 6
127.0.0.1:6379> get age
"1hello"
#############################################
127.0.0.1:6379> get age
"1hello,menffy"
127.0.0.1:6379> GETRANGE age 0 3 #按索引范围,截取字符串
"1hel"
127.0.0.1:6379> GETRANGE age 0 -1 #按索引范围,截取字符串,这里相当于get age
"1hello,menffy"
#############################################
127.0.0.1:6379> SETRANGE age 2 xx #替换指定位置开始的字符串
(integer) 13
127.0.0.1:6379> get age
"1hxxlo,menffy"
#############################################
setex #设置带过期时间的key-value
setnx #仅在key不存在时,设置key-value(分布式锁中常使用)
127.0.0.1:6379> setex key 10 hello #设置过期时间10s
OK
127.0.0.1:6379> get key
"hello"
127.0.0.1:6379> ttl key #查看key剩余过期时间,-1永不过期
(integer) 6
127.0.0.1:6379> ttl key
(integer) 2
127.0.0.1:6379> ttl key
(integer) 1
127.0.0.1:6379> ttl key
(integer) -2
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> setnx key redis #如果key不存在,就设置key:redis
(integer) 1
127.0.0.1:6379> get key
"redis"
127.0.0.1:6379> setnx key mysql #已存在key,返回0=设置失败。1是成功
(integer) 0
127.0.0.1:6379> get key
"redis"
#############################################
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量设置
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3 #批量获取值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> MSETNX k1 v1 k4 v4 #批量设置,如果key均不存在,原子操作。若有一个key已存在,则本次操作全体失败
(integer) 0
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> MSETNX k5 v5 k4 v4
(integer) 1
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k5"
4) "k2"
5) "k4"
#############################################
127.0.0.1:6379> GETSET db redis #先获取再设置
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mysql #先获取再设置
"redis"
127.0.0.1:6379> get db
"mysql"
String使用场景
- 计数器
- 统计多单位的数量 set uid:{other-id}:{field} 0 ,自增incr,自减decr
- 粉丝数
- 对象缓存存储
List常用命令
127.0.0.1:6379> LPUSH list 1 #往list列表左边压入值
(integer) 1
127.0.0.1:6379> LPUSH list 2
(integer) 2
127.0.0.1:6379> LPUSH list 3
(integer) 3
127.0.0.1:6379> LPUSH list 4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 #查看列表所有元素
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> RPUSH list 5 #往list列表右边压入值
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "5"
#################################################
127.0.0.1:6379> LRANGE list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> LINDEX list 0 #获取指定索引的值,索引从0开始
"3"
127.0.0.1:6379> LINDEX list 1
"2"
127.0.0.1:6379> LINDEX list 2
"1"
127.0.0.1:6379> LINDEX list 3
(nil)
127.0.0.1:6379> LLEN list #获取列表长度
(integer) 3
#################################################
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "3"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> LREM list 2 3 #删除2次list里值为3的元素
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "2"
3) "1"
127.0.0.1:6379> LREM list 1 1 #删除1次list里值为1的元素
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "2"
#################################################
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello4"
2) "hello3"
3) "hello2"
4) "hello1"
5) "hello"
127.0.0.1:6379> LTRIM mylist 1 2 #按索引截取列表元素,并保存
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello3"
2) "hello2"
#################################################
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello3"
2) "hello2"
127.0.0.1:6379> RPOPLPUSH mylist newlist #弹出mylist列表的最后一个元素,并将它从左侧压入newlist列表
"hello2"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello3"
127.0.0.1:6379> LRANGE newlist 0 -1
1) "hello2"
#循环队列
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello3"
127.0.0.1:6379> RPOPLPUSH mylist mylist
"hello3"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello3"
2) "hello1"
#################################################
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello3"
2) "hello1"
127.0.0.1:6379> lset mylist 0 change3 #根据索引替换列表元素
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "change3"
2) "hello1"
127.0.0.1:6379> lset mylist 2 chang4 #索引不存在则不可替换
(error) ERR index out of range
#################################################
127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist world
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> LINSERT mylist before world other #在world元素之前插入other元素
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> LINSERT mylist after world ! #在world元素之后插入!元素
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "!"
小结
- List实际上是一个链表,before Node after,left,right都可以插入值
- 如果key不存在,则创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高。
应用场景
- 消息队列(LPUSH RPOP)
- 栈(LPUSH LPOP)
Set(集合)
127.0.0.1:6379> sadd myset1 hello #往myset1集合添加元素
(integer) 1
127.0.0.1:6379> sadd myset1 world
(integer) 1
127.0.0.1:6379> sadd myset2 name
(integer) 1
127.0.0.1:6379> sadd myset2 age
(integer) 1
#############################################
127.0.0.1:6379> SMEMBERS myset1 #查看myset1集合元素
1) "hello"
2) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "age"
2) "name"
#############################################
127.0.0.1:6379> SCARD myset1 #查看myset1集合元素个数
(integer) 2
#############################################
127.0.0.1:6379> SISMEMBER myset1 hello #判断hello是否为myset1成员,返回1=True
(integer) 1
#############################################
127.0.0.1:6379> SRANDMEMBER myset1 #从myset1随机抽取元素,默认是1个,SRANDMEMBER myset1 2 则是随机抽2个
"world"
127.0.0.1:6379> SRANDMEMBER myset1
"hello"
#############################################
127.0.0.1:6379> SREM myset2 name #删除myset2集合里的name元素
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
1) "age"
#############################################
127.0.0.1:6379> SPOP myset2 #随机删除集合myset2里的元素
"age"
#############################################
127.0.0.1:6379> SMOVE myset1 myset2 hello #把集合myset1里的hello移动到集合myset2
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "age"
2) "hello"
3) "name"
#############################################
127.0.0.1:6379> sadd myset1 hello
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "hello"
2) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "age"
2) "hello"
3) "name"
127.0.0.1:6379> SDIFF myset1 myset2 #差集
1) "world"
127.0.0.1:6379> SINTER myset1 myset2 #交集
1) "hello"
127.0.0.1:6379> SUNION myset1 myset2 #并集
1) "age"
2) "hello"
3) "name"
4) "world"
应用场景
微博、将A、B、C……用户关注的人各自放在一个set集合里,粉丝也各自放在一个集合里。 实现:共同关注、共同爱好、好友推荐等。
hash(哈希)-类似python的字典
#本职上跟string没什么区别,还是key-value类型,只是value对应一个字典或map集合
127.0.0.1:6379> hset myhash key1 menffy #key是myhash,value是个字典{key1:menffy}
(integer) 1
127.0.0.1:6379> hget myhash key1 #获取myhash里的key1对应的值
"menffy"
127.0.0.1:6379> hgetall myhash #一次性获取myhash里所有的key和对应value
1) "key1"
2) "menffy"
127.0.0.1:6379> hmset myhash key2 value2 key3 value3 #往myhash里批量设置字典元素
OK
127.0.0.1:6379> hgetall myhash
1) "key1"
2) "menffy"
3) "key2"
4) "value2"
5) "key3"
6) "value3"
127.0.0.1:6379> hmget myhash key1 key2 key3 #批量获取myhash里的key对应的值
1) "menffy"
2) "value2"
3) "value3"
127.0.0.1:6379> hdel myhash key1 #删除myhash里的key1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "key2"
2) "value2"
3) "key3"
4) "value3"
127.0.0.1:6379> hlen myhash #获取myhash长度
(integer) 2
127.0.0.1:6379> HEXISTS myhash key2 #判断myhash里的key2是否存在,存在返回1,不存在返回0
(integer) 1
127.0.0.1:6379> hkeys myhash #仅获取myhash的key
1) "key2"
2) "key3"
127.0.0.1:6379> hvals myhash #仅获取myhash的value
1) "value2"
2) "value3"
####################################################
127.0.0.1:6379> hset myhash key4 1
(integer) 1
127.0.0.1:6379> HINCRBY myhash key4 1 #自增1
(integer) 2
127.0.0.1:6379> hgetall myhash
1) "key2"
2) "value2"
3) "key3"
4) "value3"
5) "key4"
6) "2"
127.0.0.1:6379> HINCRBY myhash key4 -1 #自减1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "key2"
2) "value2"
3) "key3"
4) "value3"
5) "key4"
6) "1"
127.0.0.1:6379> hsetnx myhash key5 hello #不存在就设置,存在就失败
(integer) 1
127.0.0.1:6379> hsetnx myhash key5 world
(integer) 0
127.0.0.1:6379> hgetall myhash
1) "key2"
2) "value2"
3) "key3"
4) "value3"
5) "key4"
6) "1"
7) "key5"
8) "hello"
应用
- hash适合存储对象,比如经常变更的数据,尤其是用户信息之类的, 经常需要变动。string更适合字符串存储。
Zset(有序集合)
127.0.0.1:6379> zadd myset 1 one #添加元素,需要一个score分数值,作为排序依据
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
###################################################
127.0.0.1:6379> ZADD salary 500 menffy
(integer) 1
127.0.0.1:6379> ZADD salary 2500 zhangsan
(integer) 1
127.0.0.1:6379> ZADD salary 5000 lisi
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "menffy"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #按照scores分数排序,升序。-inf=无穷小,+inf=无穷大
1) "menffy"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores #withscores,带上分数显示
1) "menffy"
2) "500"
3) "zhangsan"
4) "2500"
5) "lisi"
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #分数满足 “无穷小到2500” 的集合元素
1) "menffy"
2) "500"
3) "zhangsan"
4) "2500"
127.0.0.1:6379> ZREVRANGE salary 0 -1 [withsocres]#按scores降序排列
1) "lisi"
2) "zhangsan"
3) "menffy"
####################################################
127.0.0.1:6379> ZRANGE salary 0 -1
1) "menffy"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> ZREM salary menffy #删除元素menffy
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> ZCARD salary #有序集合salary元素个数
(integer) 2
#####################################################
127.0.0.1:6379> ZRANGE salary 0 -1 withscores
1) "menffy"
2) "500"
3) "shining"
4) "2500"
5) "zhangsan"
6) "2500"
7) "lisi"
8) "5000"
127.0.0.1:6379> ZCOUNT salary 500 2500 #集合里,分数在这个区间的元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT salary 0 500
(integer) 1
#####################################################
127.0.0.1:6379> ZINCRBY salary 1 menffy #加分数
"501"
应用
- set排序,存储班级成绩,工资表排序
- 利用分数做权重判断,比如区分普通消息或重要消息
- 排行榜,取top N
geospatial(地理位置)
实际是由zset实现的。可以用于推算地理位置信息,如:两地之间的距离,方圆几里的人。功能:朋友定位,附近的人。 经纬度查询 www.daquan.la/jingwei/
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" #在sicily里设置2个坐标,一个palermo,一个catania。 GEOADD key 经度 纬度 name
(integer) 2
redis> GEODIST Sicily Palermo Catania #获取两者之间的直线距离
"166274.15156960039"
redis> GEORADIUS Sicily 15 37 100 km #在Sicily的记录里,以经度15纬度37为中心,满足其方圆100km以内的name。可选m/km/mi英里/ft英尺
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"
withdist=显示出距离中心的距离
withcoord=显示name的经纬度
count 1=如有多个name满足,只返回一个
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOPOS Sicily Palermo Catania NonExisting #获取指定key里的name的经纬度
1) 1) "13.361389338970184"
2) "38.115556395496299"
2) 1) "15.087267458438873"
2) "37.50266842333162"
3) (nil)
#####################################################
redis> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km #以成员Agrigento为中心,查询其半径100km以内的name
1) "Agrigento"
2) "Palermo"
redis>
HyperLogLogs(基数)
基数统计的算法。
- 优点:占用的内存是固定的,且很少
- 缺点:0.81%错误率
- 应用:网页访问量。以前是用set集合存用户ID,然后统计set集合里的元素个数(存的id如果很长,数量还多,就会浪费内存)
127.0.0.1:6379> PFADD mykey a b c d e f g h i j #创建第一组元素 mykey 10个
(integer) 1
127.0.0.1:6379> PFADD mykey2 i j k l m n o p q r #创建第二组元素 mykey2 10个
(integer) 1
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 #合并第一组和第二组元素,生成第三组元素mykey3(去重)
OK
127.0.0.1:6379> PFCOUNT mykey3 #统计mykey3中的元素个数
(integer) 18
如果允许容错,那就使用hyperloglogs
如果不允许容错,那就使用set或者自己定义数据类型
Bitmaps(位图)
位存储
- 是否为感染员;是否为活跃用户;是否登录;是否打卡等。只有2个状态的都可以用bitmaps位图来做。
- bitmaps是通过操作二进制位来进行记录的,只有0和1两个状态。
#比如统计一周内,每天是否打卡
127.0.0.1:6379> SETBIT sign 0 1 #设置key=sign,偏移位0的位置,设置为1.(1可以表示为打卡了)
(integer) 0
127.0.0.1:6379> SETBIT sign 1 0
(integer) 0
127.0.0.1:6379> SETBIT sign 2 0
(integer) 0
127.0.0.1:6379> SETBIT sign 3 0
(integer) 0
127.0.0.1:6379> SETBIT sign 4 1
(integer) 0
127.0.0.1:6379> SETBIT sign 5 1
(integer) 0
127.0.0.1:6379> SETBIT sign 6 1
(integer) 0
127.0.0.1:6379> SETBIT sign 7 1
(integer) 0
127.0.0.1:6379> GETBIT sign 0 #获取偏移位0的位置的值
(integer) 1
127.0.0.1:6379> GETBIT sign 1
(integer) 0
127.0.0.1:6379> GETBIT sign 7
(integer) 1
127.0.0.1:6379> BITCOUNT sign #统计值为1的个数
(integer) 5