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

image

查看某一天是否有打卡

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

posted @ 2022-03-07 09:31  xyzZero3  阅读(65)  评论(0)    收藏  举报