redis常用命令
1、key
127.0.0.1:6379> keys * #查看所有的key
(empty array)
127.0.0.1:6379> set name zhangsan #设置一个
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> exists name #判断key是否存在
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> move name 1 #移动key到指定的db
(integer) 1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> select 1 #切换数据库
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> get name #获取key的value值
"zhangsan"
127.0.0.1:6379[1]> expire name 10 #设置key过期时间,单位是秒
(integer) 1
127.0.0.1:6379[1]> ttl name #查看key的剩余时间
(integer) 8
127.0.0.1:6379[1]> ttl name
(integer) -2
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379> type name #查看key的类型
string
2、String(字符串)
SET、GET、EXISTS、APPEND、STRLEN
##############################################################################
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 #获得值
"v1"
127.0.0.1:6379> exists key1 #判断某个key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" #追加字符串,如果当前key不存在,就相当于set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 #获得字符串的长度
(integer) 7
127.0.0.1:6379> append key1 ",redis"
(integer) 13
SETEX、SETNX
#setex (set with expire) 设置过期时间
#setnx (set with exists) 不存在时设置;在分布式锁中会经常使用
127.0.0.1:6379> setex key3 10 "hello" #设置值并且设置过期时间
OK
127.0.0.1:6379> ttl key3 #查看剩余时间
(integer) 7
127.0.0.1:6379> ttl key3 #剩余时间为-2时表示值已经过期
(integer) -2
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> setnx mykey "redis" #如果mykey不存在,才创建mykey
(integer) 1
127.0.0.1:6379> setnx mykey "mongodb" #如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
INCR、DECR、INCRBY、DECRBY
127.0.0.1:6379> set views 0 #初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增1 浏览量变为1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views #自减1 浏览量变为0
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10 #可以设置步长,指定增量
(integer) 10
127.0.0.1:6379> get views
"10"
127.0.0.1:6379> decrby views 5 #可以设置步长,指定减量
(integer) 5
GETRANGE、SETRANGE
#字符串范围 getrange
127.0.0.1:6379> set key1 "hello,redis" #设置值
OK
127.0.0.1:6379> get key1 #获得值
"hello,redis"
127.0.0.1:6379> getrange key1 0 2 #截取字符串 [0,2]
"hel"
127.0.0.1:6379> getrange key1 0 -1 #截取全部字符串 和 get key 是一样的
"hello,redis"
#替换 setrange
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xx #替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
#对象
#这里的key是一个巧妙的设计:user:{id}:{field}
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "18"
MSET、MSETNX、MGET
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同时设置多个值
OK
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 #msetnx是一个原子性操作,要么都成功,要么都失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
GET、SET
getset #先get再set
127.0.0.1:6379> getset db redis #如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
String 类型的使用场景:字符串、数字、计数器
3、List(列表)
基本的数据类型,列表
在redis中,可以把 list 模拟为栈、队列、阻塞队列
所有的 list 命令都是 l 开头
LPUSH、RPUSH
127.0.0.1:6379> lpush list one #将一个值或多个值插入到列表的头部(左)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> rpush list five #将一个或多个值放到列表的尾部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "five"
LPOP、RPOP
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> LPOP list #移除列表左边的元素(第一个元素)
"three"
127.0.0.1:6379> RPOP list #移除列表右边的元素(最后一个元素)
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
LINDEX
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 #通过下标获得 list 中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
LLEN
127.0.0.1:6379> lpush list one two three
(integer) 3
127.0.0.1:6379> llen list #返回列表的长度
(integer) 3
LREM
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one #移除 list 集合中指定个数的 value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
TRIM
127.0.0.1:6379> lrange list 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
4) "hello4"
127.0.0.1:6379> ltrim list 1 2 #通过下标截取指定范围内的元素,并删除其他元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "hello2"
2) "hello3"
RPOPLPUSH
#移除列表的右边的元素(最后一个),将它添加到另一个列表的左边(第一个)
127.0.0.1:6379> lrange list 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
127.0.0.1:6379> rpoplpush list list1
"hello3"
127.0.0.1:6379> lrange list 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> lrange list1 0 -1
1) "hello3"
LSET
#将列表中指定下标的值替换为另一个值
127.0.0.1:6379> exists list #判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item #如果列表不存在,set值会报错
(error) ERR no such key
127.0.0.1:6379> lpush list hello1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "hello1"
127.0.0.1:6379> lset list 0 item #如果列表存在,set会更新指定下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lset list 1 item1 #如果当前下标不存在,则会报错
(error) ERR index out of range
LINSERT
#将某个具体的value值插入到列表中某个元素的前(后)面
127.0.0.1:6379> rpush list hello world
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert list before world other #将值插入到元素的前面
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert list after world new #将值插入到元素的后面
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
总结
- list 实际上是一个链表,before node after,left,right 都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高。操作中间元素,相对来说效率会低一点
4、Set(集合)
set 中的值是不能重复的
SADD、SMEMBERS、SISMEMBER
127.0.0.1:6379> sadd myset hello world ghb redis #添加元素
(integer) 4
127.0.0.1:6379> SMEMBERS myset #查看指定set集合的所有值
1) "redis"
2) "hello"
3) "world"
4) "ghb"
127.0.0.1:6379> SISMEMBER myset hello #判断set集合中是否存在某个值
(integer) 1 #存在
127.0.0.1:6379> SISMEMBER myset kuangshen
(integer) 0 #不存在
SCARD
127.0.0.1:6379> SCARD myset #获取set集合的长度
(integer) 4
SREM
127.0.0.1:6379> SREM myset ghb #移除set集合中指定的元素
(integer) 1
127.0.0.1:6379> SISMEMBER myset ghb
(integer) 0 #已经不存在
SRANDMEMBER
127.0.0.1:6379> srandmember myset #随机抽取set集合中的一个元素
"hello"
127.0.0.1:6379> srandmember myset
"world"
127.0.0.1:6379> srandmember myset 2 #随机抽取set集合中指定个数的元素
1) "redis"
2) "world"
127.0.0.1:6379> srandmember myset 2
1) "hello"
2) "redis"
SPOP
127.0.0.1:6379> spop myset #随机删除set集合中的一个元素
"world"
127.0.0.1:6379> spop myset 1 #随机删除set集合中指定数量的元素
"hello"
127.0.0.1:6379> SMEMBERS myset
1) "redis"
SMOVE
127.0.0.1:6379> sadd myset redis hello world
(integer) 3
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 redis #将一个指定的值,移动到另一个set集合中
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
127.0.0.1:6379> SMEMBERS myset2
1) "set2"
2) "redis"
SDIFF、SINTER、SUNION
127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> sadd set2 c d e f
(integer) 4
127.0.0.1:6379> sdiff set1 set2 #差集 - 返回 set1 不同于 set2 的元素
1) "a"
2) "b"
127.0.0.1:6379> sdiff set2 set1 #差集 - 返回 set2 不同于 set1 的元素
1) "d"
2) "e"
3) "f"
127.0.0.1:6379> sinter set1 set2 #交集 - 返回 set1 和 set2 相同的元素(共同好友)
1) "c"
127.0.0.1:6379> sunion set1 set2 #并集 - 返回 set1 和 set2 全部的元素
1) "a"
2) "f"
3) "d"
4) "b"
5) "c"
6) "e"
5、Hash(哈希)
Map 集合,key - value(value 值是 Map 集合)
HSET、HSETNX、HGET、HMGET、HGETALL
127.0.0.1:6379> hset myhash hello world db redis #set 一个或多个具体的 key-value
(integer) 2
127.0.0.1:6379> hsetnx myhash db redis
(integer) 0
127.0.0.1:6379> hsetnx myhash age 20 #set 一个 key-value,如果不存在则可以添加
(integer) 1
127.0.0.1:6379> hget myhash hello #获取一个字段值
"world"
127.0.0.1:6379> hmget myhash hello db #获取多个字段值
1) "world"
2) "redis"
127.0.0.1:6379> hgetall myhash #获取hash表的全部数据
1) "hello"
2) "world"
3) "db"
4) "redis"
HDEL
127.0.0.1:6379> hgetall myhash
1) "hello"
2) "world"
3) "db"
4) "redis"
127.0.0.1:6379> hdel myhash hello #删除指定的字段值
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "db"
2) "redis"
HLEN
127.0.0.1:6379> hset myhash name ghb age 20 gender 1
(integer) 3
127.0.0.1:6379> hgetall myhash
1) "name"
2) "ghb"
3) "age"
4) "20"
5) "gender"
6) "1"
127.0.0.1:6379> hlen myhash #获取hash表的键值对数量
(integer) 3
HEXISTS
127.0.0.1:6379> hexists myhash name #判断hash表中指定字段是否存在
(integer) 1
127.0.0.1:6379> hexists myhash db
(integer) 0
HKEYS、HVALS
127.0.0.1:6379> hkeys myhash #获取hash表中所有的field值
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> hvals myhash #获取hash表中所有的value值
1) "ghb"
2) "20"
3) "1"
HINCRBY
127.0.0.1:6379> HINCRBY myhash age 1 #自增 +1
(integer) 21
127.0.0.1:6379> HINCRBY myhash age -1 #hash 没有 decrby,可以用负数来减
(integer) 20
Hash 适合于对象的存储,String 更加适合字符串的存储
6、Zset(有序集合)
在 set 的基础上,增加了一个值
ZADD、ZRANGE、ZREVRANGE
127.0.0.1:6379> zadd myset 1 one 2 two 3 three #添加一个或多个值
(integer) 3
127.0.0.1:6379> zrange myset 0 -1 #返回指定范围内的值
1) "one"
2) "two"
3) "three"
ZRANGEBYSCORE、ZREVRANGEBYSCORE
127.0.0.1:6379> zrangebyscore salary -inf inf #根据score进行排序,从小到大
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrangebyscore salary -inf inf withscores #根据score进行排序,从小到大。显示score值
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> zrevrangebyscore salary inf -inf withscores #根据score进行排序,从大到小。
1) "zhangsan"
2) "5000"
3) "xiaohong"
4) "2500"
5) "kuangshen"
6) "500"
ZREM
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong #移除指定的元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "zhangsan"
ZCARD
127.0.0.1:6379> zcard salary #查看集合中的元素个数
(integer) 2
ZCOUNT
127.0.0.1:6379> zadd myset 1 hello 2 world 3 ghb
(integer) 3
127.0.0.1:6379> zcount myset 1 3 #返回指定score区间元素的个数
(integer) 3
三种特殊数据类型
geospatial(地理位置)
GEOADD
#添加地理位置
#两级是无法直接添加的
#参数 key value(经度,纬度,名称)
127.0.0.1:6379> geoadd china:city 114.352482 36.103442 anyang
(integer) 1
127.0.0.1:6379> geoadd china:city 112.434468 34.663041 luoyang
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504962 29.533155 chongqing
(integer) 1
GEODIST
#返回两个给定位置之间的距离
#单位
# m - 米
# km - 千米
# mi - 英里
# ft - 英尺
127.0.0.1:6379> geodist china:city anyang chongqing km
"1034.6769"
127.0.0.1:6379> geodist china:city anyang luoyang km
"236.4619"
GEOHASH
该命令将返回11个字符的geohash字符串
127.0.0.1:6379> geohash china:city luoyang
1) "wqpvnw0qbg0"
127.0.0.1:6379> geohash china:city chongqing
1) "wm78p86e170"
127.0.0.1:6379> geohash china:city anyang
1) "ww3m6hkvvc0"
GEOPOS
#获取指定元素的经度和纬度
127.0.0.1:6379> geopos china:city anyang
1) 1) "114.35248106718063354"
2) "36.10344151006869851"
127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.50495976209640503"
2) "29.53315530684997015"
127.0.0.1:6379> geopos china:city luoyang
1) 1) "112.43446558713912964"
2) "34.6630405862934694"
GEORADIUS
#返回以指定的经纬度为中心,查找半径为10000km内,集合中的元素名称
127.0.0.1:6379> georadius china:city 112.43446558713912964 34.6630405862934694 10000 km
1) "chongqing"
2) "luoyang"
3) "anyang"
#返回以指定的经纬度为中心,查找半径为10000km内,集合中的元素名称和距离
127.0.0.1:6379> georadius china:city 112.43446558713912964 34.6630405862934694 10000 km withdist
1) 1) "chongqing"
2) "798.2323" #距离
2) 1) "luoyang"
2) "0.0000"
3) 1) "anyang"
2) "236.4619"
#返回以指定的经纬度为中心,查找半径为10000km内,集合中的元素名称、距离、经纬度
127.0.0.1:6379> georadius china:city 112.43446558713912964 34.6630405862934694 10000 km withdist withcoord
1) 1) "chongqing"
2) "798.2323"
3) 1) "106.50495976209640503" #经度
2) "29.53315530684997015" #纬度
2) 1) "luoyang"
2) "0.0000"
3) 1) "112.43446558713912964"
2) "34.6630405862934694"
3) 1) "anyang"
2) "236.4619"
3) 1) "114.35248106718063354"
2) "36.10344151006869851"
#返回指定数量的以指定的经纬度为中心,查找半径为10000km内,集合中的元素名称、距离、经纬度
127.0.0.1:6379> georadius china:city 112.43446558713912964 34.6630405862934694 10000 km withdist withcoord count 1 #一个
1) 1) "luoyang"
2) "0.0000"
3) 1) "112.43446558713912964"
2) "34.6630405862934694"
GEORADIUSBYMEMBER
#返回以指定元素为中心,半径为1000km内,集合中的元素
127.0.0.1:6379> georadiusbymember china:city luoyang 1000 km
1) "luoyang"
2) "chongqing"
3) "anyang"
Geo底层的实现原理其实就是Zset,我们可以使用Zset命令来操作Geo
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "luoyang"
3) "anyang"
127.0.0.1:6379> zrem china:city luoyang
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "anyang"
hyperloglog
什么是基数?
基数是指一个集合中不重复的元素
PFADD、PFCOUNT、PFMERGE
127.0.0.1:6379> pfadd mykey a b c d e f g h i j #创建第一组元素 mykey
(integer) 1
127.0.0.1:6379> PFCOUNT mykey #统计 mykey 中元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m #创建第二组元素 mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2 #统计 mykey2 中元素的基数数量
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 #合并 mykey 和 mykey2 为 mykey3(并集)
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
bitmaps
位存储
统计用户信息,活跃 - 不活跃 登录 - 未登录
只有两个状态的,都可以使用bitmaps
使用 bitmaps 纪录周一到周日的打卡
SETBIT
查看某一天是否有打卡
GETBIT
127.0.0.1:6379> getbit sign 1 #周二
(integer) 0
127.0.0.1:6379> getbit sign 2 #周三
(integer) 0
127.0.0.1:6379> getbit sign 3 #周四
(integer) 1
统计操作,统计打卡的天数
BITCOUNT
127.0.0.1:6379> bitcount sign #统计本周的打卡纪录
(integer) 3