Redis(二)(String、List、Set、Hash、Zset、Geospatial、Hyperloglog、Bitmaps数据类型)

1、String(字符串)

(1)字符串基本操作
127.0.0.1:6379> set key helllo #设置值
OK
127.0.0.1:6379> get key #获取值
"helllo"
127.0.0.1:6379> APPEND key ,world #追加字符串,如果key不存在,就相当于set key
(integer) 12
127.0.0.1:6379> get key 
"helllo,world"
127.0.0.1:6379> EXISTS key #判断key是否存在
(integer) 1
127.0.0.1:6379> STRLEN key #获取字符串的长度
(integer) 12
127.0.0.1:6379> set key1 hello,world
OK
127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串 [0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部的字符串
"hello,world"
127.0.0.1:6379> set key1 asdfgh
OK
127.0.0.1:6379> SETRANGE key1 1 xxx #替换指定位置开始的字符串
(integer) 6
127.0.0.1:6379> get key1
"axxxgh"
(2)自增,自减等操作
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> gte views
(error) ERR unknown command `gte`, with args beginning with: `views`, 
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views #自减1
(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
127.0.0.1:6379> get views
"5"
(3)

setex:设置过期时间
setnx:不存在再设置(分布式锁中常常使用)

127.0.0.1:6379> setex key2 30 hello #设置key2值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key2 # 查看剩余时间
(integer) 18
127.0.0.1:6379> setnx mykey redis # 如果mykey不存在,则创建这个key
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
127.0.0.1:6379> setnx mykey mongdb #如果mykey存在,则创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "k2"
4) "k1"
5) "k3"
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 #原子操作,k1存在,所以失败
(integer) 0
127.0.0.1:6379> gte k4
(error) ERR unknown command `gte`, with args beginning with: `k4`, 
127.0.0.1:6379> 
(4)对象
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18  #key1是user:1:name,key2是user:1:age
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "18"
127.0.0.1:6379> 

getset复合命令

127.0.0.1:6379> getset db redis # 如果key不存在,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongdb #如果key存在,则获取原来的值,并设置新值
"redis"
127.0.0.1:6379> get db
"mongdb"

String类似的使用场景:value除了是我们的字符串还可以是数字。

  • 计数器
  • 对象缓存存储

2、List列表

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 #获取list中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE 0 1 #通过区间获取具体的值
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE list 0 1
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list rigth ##将一个值或多个值插入到列表的尾部
(integer) 4
##########################################
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "rigth"
127.0.0.1:6379> LPOP list #移除list的第一个元素
"three"
127.0.0.1:6379> RPOP list # 移除list的最后一个元素
"rigth"
##########################################
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 0 #通过下标获取list中的某个值
"two"
127.0.0.1:6379> LLEN list #返回list的长度
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LPUSH list two
(integer) 3
##########################################
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "two"
3) "one"
127.0.0.1:6379> LREM list 2 two # 移除list中指定个数的value,精确匹配
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
127.0.0.1:6379> LREM list 1 one
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
(empty list or set)
##########################################
 127.0.0.1:6379> RPUSH list one two three four
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379> LTRIM list 1 2 # 通过下标截取指定的长度,list已被改变
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "three"
##########################################
rpoplpush:移除列表的最后一个元素,并将其添加到另一个列表中
127.0.0.1:6379> RPUSH list one two three
(integer) 3
127.0.0.1:6379> RPOPLPUSH list list1 #移除列表的最后一个元素,并将其添加到另一个列表中
"three"
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
2) "two"
127.0.0.1:6379> LRANGE list1 0 -1
1) "three"
##########################################
lset:将列表中指定下标的值替换为另外一个值
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> EXISTS list
(integer) 0
127.0.0.1:6379> lset list 0 one #不存在会报错
(error) ERR no such key
127.0.0.1:6379> RPUSH list one
(integer) 1
127.0.0.1:6379> LRANGE list 0 0
1) "one"
127.0.0.1:6379> lset list 0 two #如果存在,更新下标的值
OK
127.0.0.1:6379> LRANGE list 0 0
1) "two"
##########################################
LINSERT:将某个值插入到某个列表中某个元素的前面或后面
127.0.0.1:6379> RPUSH list hello hello1 hello1
(integer) 3
127.0.0.1:6379> lset list 2 hello2
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> LINSERT list before hello1 111 #将111插入到hello1中的前面
(integer) 4
127.0.0.1:6379> LINSERT list after hello2 222  #将222插入到hello12中后面
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "111"
3) "hello1"
4) "hello2"
5) "222"
127.0.0.1:6379> 

总结

  • List更像一个链表,两边都可以插入。
  • 消息队列(LRUSH,RPOP),栈(LRUSH,LPOP)。

3、Set集合

Set中的元素是不允许重复的

##########################################
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> sadd set hello # 添加元素
(integer) 1
127.0.0.1:6379> sadd set hello1
(integer) 1
127.0.0.1:6379> sadd set hello2
(integer) 1
127.0.0.1:6379> SMEMBERS set #  查看所有元素
1) "hello1"
2) "hello2"
3) "hello"
127.0.0.1:6379> SISMEMBER set hello #判断某个元素是不是在集合中
(integer) 1
127.0.0.1:6379> SISMEMBER set 111
(integer) 0
##########################################
127.0.0.1:6379> SCARD set # 获取set中元素的个数
(integer) 3
127.0.0.1:6379> SREM set hello #移除set中的指定元素
(integer) 1
127.0.0.1:6379> SMEMBERS set
1) "hello1"
2) "hello2"
##########################################
随机抽取某几个元素
127.0.0.1:6379> sadd myset 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379> SRANDMEMBER myset # 随机抽取一个元素
"2"
127.0.0.1:6379> SRANDMEMBER myset 
"1"
127.0.0.1:6379> SRANDMEMBER myset 3 # 随机抽取3个元素
1) "5"
2) "7"
3) "8"
##########################################
127.0.0.1:6379> SMEMBERS myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> spop myset #随机移除一个元素
"5"
127.0.0.1:6379> SMEMBERS myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
6) "7"
7) "8"
8) "9"
##########################################
将一个指定的值移到另一个set中
127.0.0.1:6379> sadd myset1 hello1 hello2
(integer) 2
127.0.0.1:6379> sadd myset2 world1 world2
(integer) 2
127.0.0.1:6379> SMOVE myset1 myset2 hello1 #将hello1移到myset2中
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "hello2"
127.0.0.1:6379> SMEMBERS myset2
1) "world2"
2) "world1"
3) "hello1"
##########################################
集合操作:差集,交集,并集
127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> sadd set2  a c d e
(integer) 4
127.0.0.1:6379> SDIFF set1 set2 #求set1的差集
1) "b"
127.0.0.1:6379> SDIFF set2 set1 #求set2的差集
1) "e"
2) "d"
127.0.0.1:6379> SINTER set1 set2 # 求两个集合的交集 
1) "a"
2) "c"
127.0.0.1:6379> SUNION set1 set2 #求两个集合的并集
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"
## 应用非常广泛,比如共同关注,推荐好友

4、Hash哈希

就是key-map类型,值是map集合

##########################################
127.0.0.1:6379> hset myhash key1 hello # 创建一个值 key-value类型
(integer) 1
127.0.0.1:6379> hget myhash key1
"hello"
127.0.0.1:6379> hset myhash key1 hello1 #如果该key1中有value,则就会替换原来的value
(integer) 0
127.0.0.1:6379> hset myhash key1 hello1 key2 hello2 key3 hello3 
(integer) 2
127.0.0.1:6379> hmget myhash key1 key2 #获取指定key对应的value值
1) "hello1"
2) "hello2"
127.0.0.1:6379> hgetall myhash # 获取hash表中所有的值
1) "key1"
2) "hello1"
3) "key2"
4) "hello2"
5) "key3"
6) "hello3"
127.0.0.1:6379> hdel myhash key1 #删除指定的字段
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "key2"
2) "hello2"
3) "key3"
4) "hello3"
##########################################
127.0.0.1:6379> HGETALL myhash 
1) "key2"
2) "hello2"
3) "key3"
4) "hello3"
5) "key1"
6) "value1"
7) "key4"
8) "value4"
127.0.0.1:6379> HLEN myhash #获取hash表中元素的个数
(integer) 4
127.0.0.1:6379> HEXISTS myhash key1 # 判断hash表中是否包含指定元素
(integer) 1
127.0.0.1:6379> HEXISTS myhash key5
(integer) 0
##########################################
127.0.0.1:6379> hkeys myhash #获取所有的key
1) "key2"
2) "key3"
3) "key1"
4) "key4"
127.0.0.1:6379> hvals myhash #获取所有的value
1) "hello2"
2) "hello3"
3) "value1"
4) "value4"
##########################################
127.0.0.1:6379> hset myhash key1 6
(integer) 1
127.0.0.1:6379> HINCRBY myhash key1 2 #在原来的基础上加一个值
(integer) 8
127.0.0.1:6379> HINCRBY myhash key1 -3
(integer) 5
127.0.0.1:6379> hsetnx myhash key2 hello #如果不存在可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash key2 hello1 #如果存在设置失败
(integer) 0
127.0.0.1:6379> HGET myhash key2
"hello"

应用:存储关系型的数据,更适合对象的存储

127.0.0.1:6379> hset user1 name yaojiangang age 18
(integer) 2
127.0.0.1:6379> Hgetall user1
1) "name"
2) "yaojiangang"
3) "age"

5、Zset(有序集合)

在Set的基础上加了一个值,用于排序。

##########################################
127.0.0.1:6379> zadd myzset 1 one 4 two 3 three  # 添加元素到集合,每个人元素前面需加一个标识符
(integer) 3
127.0.0.1:6379> ZRANGE myzset 0 -1 #Zset默认会根据每个元素前面的标识进行排除
#查看集合中所有元素
1) "one"
2) "three"
3) "two"
##########################################
127.0.0.1:6379> zadd salary 2500 xiaohua 800 xiaoli 1600 xiaobai 700 xiaohei
(integer) 4
127.0.0.1:6379> ZREVRANGE salary 0 -1 #按降序进行排列
1) "xiaohua"
2) "xiaoli"
3) "xiaohei"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #从小到大排序
1) "xiaohei"
2) "xiaoli"
3) "xiaobai"
4) "xiaohua"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 返回排序后并且带参数的
1) "xiaohei"
2) "700"
3) "xiaoli"
4) "800"
5) "xiaobai"
6) "1600"
7) "xiaohua"
8) "2500"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 1000 withscores # 显示规定范围内排序信息
1) "xiaohei"
2) "700"
3) "xiaoli"
4) "800"
##########################################
127.0.0.1:6379> ZRANGE salary 0 -1
1) "xiaohei"
2) "xiaoli"
3) "xiaobai"
4) "xiaohua"
127.0.0.1:6379> ZREM salary xiaobai #移除集合中的某个元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 # 查看集合中的所有元素
1) "xiaohei"
2) "xiaoli"
3) "xiaohua"
127.0.0.1:6379> ZCARD salary # 获取集合中的元素个数
(integer) 3
##########################################
127.0.0.1:6379> zadd myzset 2 zhang 1 li 7 tian 5 yao 4 zhao
(integer) 5
127.0.0.1:6379> zcount myzset 4 5 #获取指定区间的元素个数
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "li"
2) "zhang"
3) "zhao"
4) "yao"
5) "tian

6、Geospatial地理位置

朋友的定位,附近的人,打车距离计算等,Redis中的Geospatial提供。
(1)geoadd :添加地理位置

#两极没法添加,key是 china:city,value是经度,纬度,名称
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing 121.47 31.23 shanghai
(integer) 2
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shengzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 xian
(integer) 1

(2)geopos:获得某个城市的经纬度

127.0.0.1:6379> geopos china:city beijing shanghai xian
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.47000163793563843"
   2) "31.22999903975783553"
3) 1) "120.1600000262260437"
   2) "30.2400003229490224"

(3)geodist:查看两地之间的距离

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km  #以110 30经纬度为中心,半径为1000km找附近的城市
1) "chongqin"
2) "shengzhen"
3) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km #缩小半径
1) "chongqin"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist #显示到110 30的距离
1) 1) "chongqin"
   2) "341.9374"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord 
1) 1) "chongqin"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 1  #筛选出指定的城市
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"

(4)GEORADIUSBYMEMBER:找出位于指定元素周围的城市

127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 1000 km
1) "xian"
2) "shanghai"
127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看全部元素
1) "chongqin"
2) "shengzhen"
3) "xian"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city beijing #删除某个位置
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqin"
2) "shengzhen"
3) "xian"
4) "shanghai"

7、Hyperloglog

Hyperloglog基数统计的算法,比如需要计算网站的访问量等场景。

127.0.0.1:6379> PFADD mykey a b c d e f g h #创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey #统计第一组中元素的数量
(integer) 8
127.0.0.1:6379> PFADD mykey1 a b f i k l m n
(integer) 1
127.0.0.1:6379> PFCOUNT mykey1
(integer) 8
127.0.0.1:6379> PFMERGE mykey2 mykey mykey1 #合并两组的数据到新的组中
OK
127.0.0.1:6379> PFCOUNT mykey2
(integer) 13

8、Bitmaps

当一种数据有两种状态时,可以使用Bitmaps进行统计,比如统计用户的登录信息,员工的打卡等场景。
都是操作二进制位来进行记录,效率非常高。

#### 记录周一到周五的打卡记录
127.0.0.1:6379> setbit sign 0 0
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
### 查看某一天是否有打卡
127.0.0.1:6379> getbit sign 1
(integer) 1
127.0.0.1:6379> getbit sign 0
(integer) 0
### 统计这周的打卡天数
127.0.0.1:6379> BITCOUNT sign
(integer) 3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值