Redis之数据类型,好记性不如烂笔头(二)

我是方圆,励志写出好文章的博主
54青年节,大家节日快乐

2. 五大数据类型和三小数据类型

2.1 五大数据类型

2.1.1 String类型
127.0.0.1:6379> set name xiaowang #设置值
OK
127.0.0.1:6379> get name #获取值
"xiaowang"
127.0.0.1:6379> exists name #查看key是否存在
(integer) 1
127.0.0.1:6379> move name 1 #移动key到数据库1
(integer) 1
127.0.0.1:6379> select 1 #切换数据库1
OK
127.0.0.1:6379[1]> get name
"xiaowang"
127.0.0.1:6379[1]> expire name 5 #设置key的生命时间
(integer) 1
127.0.0.1:6379[1]> ttl name #查看剩余时间
(integer) 1
127.0.0.1:6379[1]> ttl name #时间耗尽后为-2
(integer) -2
127.0.0.1:6379[1]> set name xiaowang3
OK
127.0.0.1:6379[1]> append name 3 #在value后连接3值
(integer) 10
127.0.0.1:6379[1]> get name
"xiaowang33"
127.0.0.1:6379[1]> set num 1
OK
127.0.0.1:6379[1]> incr num #增加1
(integer) 2
127.0.0.1:6379[1]> get num
"2"
127.0.0.1:6379[1]> decr num #减少1
(integer) 1
127.0.0.1:6379[1]> get num
"1"
127.0.0.1:6379[1]> incrby num 3 #设置了增加步长,增加3,返回值即为结果
(integer) 4
127.0.0.1:6379[1]> decrby num 5 #设置减少步长,减少5
(integer) -1
127.0.0.1:6379[1]> getrange name 0 3 #获取范围内的值,全闭区间
"xiao"
127.0.0.1:6379[1]> getrange name 0 -1 #获取全部范围的值
"xiaowang33"
127.0.0.1:6379[1]> setrange name 7 54qingnian #从指定位置开始向后添加值
(integer) 17
127.0.0.1:6379[1]> get name
"xiaowan54qingnian"
127.0.0.1:6379[1]> type name #查看数据类型
string
127.0.0.1:6379[1]> setex name1 5 yb #设置key的同时,添加生命时间
OK
127.0.0.1:6379[1]> setnx name xiaowang #不存在时才能设置成功,已经存在的key则会设置失败
(integer) 0
127.0.0.1:6379[1]> get name 
"xiaowan54qingnian"
127.0.0.1:6379[1]> mset name2 2 name3 3 #设置多个值
OK
127.0.0.1:6379[1]> msetnx name4 4 name5 5 #设置多个值,其中有一个设置失败则全部失败,setnx只能添加未存在的值
(integer) 1
127.0.0.1:6379[1]> mget name2 name3 name4  #获取多个值
1) "2"
2) "3"
3) "4"
127.0.0.1:6379[1]> getset num 1 #先获取再改变值
"-1"
127.0.0.1:6379[1]> get num
"1"

setxn 命令常在分布式锁中使用,不存在时才会进行添加
String可以用做计数器

2.1.2 Hash类型

本质上和String类型区别不大

127.0.0.1:6379[1]> hset myhash field1 1 #向myhash中添加值
(integer) 1
127.0.0.1:6379[1]> hmset myhash field2 2 field3 3 #添加多个值
OK
127.0.0.1:6379[1]> hsetnx myhash field3 33 #不存在时才能添加成功
(integer) 0
127.0.0.1:6379[1]> hsetnx myhash field4 4
(integer) 1
127.0.0.1:6379[1]> hget myhash field1 #获取值
"1"
127.0.0.1:6379[1]> hmget myhash field2 field3 #获取多个值
1) "2"
2) "3"
127.0.0.1:6379[1]> hgetall myhash #获取全部值
1) "field1"
2) "1"
3) "field2"
4) "2"
5) "field3"
6) "3"
127.0.0.1:6379[1]> hlen myhash #获取myhash的大小
(integer) 3
127.0.0.1:6379[1]> hexists myhash field3 #判断field3是否存在
(integer) 1
127.0.0.1:6379[1]> hkeys myhash #获取所有key
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379[1]> hvals myhash #获取所有value
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]> hdel myhash field2 #删除field2
(integer) 1
127.0.0.1:6379[1]> hincrby myhash field3 3 #使字段3增加3
(integer) 6

Hash数据类型用于存储经常变动的信息,相比于String更适合存储对象

2.1.3 Set类型

Set类型不能重复

127.0.0.1:6379[1]> sadd myset hello world #添加
(integer) 2
127.0.0.1:6379[1]> smembers myset #显示所有成员
1) "world"
2) "hello"
127.0.0.1:6379[1]> sismember myset hello #判断成员是否存在
(integer) 1
127.0.0.1:6379[1]> scard myset #返回myset的大小
(integer) 2
127.0.0.1:6379[1]> srem myset world #移除指定成员
(integer) 1
127.0.0.1:6379[1]> sadd myset set1 set2 set3 set4 set5
(integer) 5
127.0.0.1:6379[1]> srandmember myset #随机抽取成员
"set2"
127.0.0.1:6379[1]> srandmember myset 3 #随机抽取3个成员
1) "set2"
2) "set3"
3) "hello"
127.0.0.1:6379[1]> spop myset  #随机弹出一个成员
"set5"
127.0.0.1:6379[1]> spop myset 
"set1"
127.0.0.1:6379[1]> smove myset myset2 set4 #移动指定成员到myset2
(integer) 1
127.0.0.1:6379[1]> smembers myset2
1) "set4"
127.0.0.1:6379[1]> smembers myset
1) "set2"
2) "set3"
3) "hello"
127.0.0.1:6379[1]> sadd myset 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379[1]> sadd myset2 7 8 9 10
(integer) 4
127.0.0.1:6379[1]> sdiff myset myset2 #取差集
1) "5"
2) "set2"
3) "set3"
4) "4"
5) "3"
6) "hello"
7) "1"
8) "2"
9) "6"
127.0.0.1:6379[1]> sinter myset myset2 #取交集
1) "8"
2) "9"
3) "7"
127.0.0.1:6379[1]> sunion myset myset2 #取并集
 1) "5"
 2) "set2"
 3) "set3"
 4) "4"
 5) "6"
 6) "3"
 7) "8"
 8) "1"
 9) "2"
10) "set4"
11) "10"
12) "9"
13) "hello"
14) "7"

Set数据类型,利用交集可以实现b站粉丝共同关注的功能。

2.1.4 ZSet类型

有序的Set集合

127.0.0.1:6379[1]> zadd myzset 1 one 2 two 3 three #添加元素
(integer) 3
127.0.0.1:6379[1]> zrangebyscore myzset -inf +inf #显示从小到大的排列
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[1]> zrevrangebyscore myzset +inf -inf #显示从大到小的排列
1) "three"
2) "two"
3) "one"
127.0.0.1:6379[1]> zrevrange myzset 0 -1 #显示所有倒序排列的元素
1) "three"
2) "two"
3) "one"
127.0.0.1:6379[1]> zrange myzset 0 -1 #显示所有正序排列的元素
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[1]> zrem myzset two #移除指定元素
(integer) 1
127.0.0.1:6379[1]> zcard myzset #返回myset大小
(integer) 2
127.0.0.1:6379[1]> zcount myzset -inf +inf #区间计数
(integer) 2
2.1.5 List类型

List实际上是一个链表,可以当作队列或者来用,可重

127.0.0.1:6379[1]> lpush list 1 #在左边添加一个值
(integer) 1
127.0.0.1:6379[1]> rpush list 2 #在右边添加一个值
(integer) 2
127.0.0.1:6379[1]> rpush list 3 
(integer) 3
127.0.0.1:6379[1]> lrange list 0 -1 #显示所有值
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]> lpop list #在左边弹出一个值
"1"
127.0.0.1:6379[1]> rpop list #在右边弹出一个值
"3"
127.0.0.1:6379[1]> rpush list 3
(integer) 2
127.0.0.1:6379[1]> rpush list 4
(integer) 3
127.0.0.1:6379[1]> rpush list 5
(integer) 4
127.0.0.1:6379[1]> lpush list 1
(integer) 5
127.0.0.1:6379[1]> lindex list 1 #获取指定索引的值
"2"
127.0.0.1:6379[1]> llen list #返回list的大小
(integer) 5
127.0.0.1:6379[1]> lpush list 1
(integer) 6
127.0.0.1:6379[1]> lrem list 1 1 #y移除1个value为1的值
(integer) 1
127.0.0.1:6379[1]> ltrim list 0 2 #窃取0-2索引,直接回改变list
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]> rpoplpush list list1 #右边出左边进到另一个list1
"3"
127.0.0.1:6379[1]> rpoplpush list list #自身右边出左边进
"2"
127.0.0.1:6379[1]> lrange list 0 -1
1) "2"
2) "1"
127.0.0.1:6379[1]> lset list 0 1 #改变0位置的值
OK
127.0.0.1:6379[1]> lset list 2 3 #改变2位置的值,没有值会报错
(error) ERR index out of range
127.0.0.1:6379[1]> lrange list 0 -1
1) "1"
2) "1"
127.0.0.1:6379[1]> linsert list after 1 3 #插入值,在list第一个1值的后边插入值3
(integer) 3
127.0.0.1:6379[1]> lrange list 0 -1
1) "1"
2) "3"
3) "1"

2.2 三小数据类型

2.2.1 geospatial类型
geoadd key 经度 纬度 value #添加地理位置
geodist #显示距离长度
georedius #以某地为中心,查找范围内的地点
2.2.2 Hyperloglog类型

基数统计的算法,2的64次幂,只要12KB内存,从内存的角度,Hyperloglog很好。

127.0.0.1:6379[1]> pfadd mykey 1 2 3 #添加元素
(integer) 1
127.0.0.1:6379[1]> pfadd mykey2 3 4 5 6
(integer) 1
127.0.0.1:6379[1]> pfmerge mykey mykey2 #取并集
OK
127.0.0.1:6379[1]> pfcount mykey #统计数量
(integer) 6

若在允许容错的情况下,可以用于统计计数

2.2.3 Bitmaps类型

位图,只有 0 1 两种状态,可以用于实现签到、未签到等

127.0.0.1:6379[1]> setbit bit 0 1 #设置0的状态为1
(integer) 0
127.0.0.1:6379[1]> setbit bit 1 1 #设置1的状态为1
(integer) 0
127.0.0.1:6379[1]> setbit bit 2 0 #设置2的状态为0
(integer) 0
127.0.0.1:6379[1]> getbit bit 2 #获取2的状态
(integer) 0
127.0.0.1:6379[1]> getbit bit 1 #获取1的状态
(integer) 1
127.0.0.1:6379[1]> bitcount bit  #获取所有1状态的数量
(integer) 2

在这里插入图片描述

该系列其他文章

Redis之必备基础知识点,文读百变其意自现(一)
Redis之事务乐观锁和Jedis,谁说的Redis不能实现乐观锁的?(三)
Redis之redis.conf解析,了解了这些配置信息,才能说了解Redis(四)
Redis之主从复制和哨兵模式,差不多儿啦(五)
Redis之RDB和AOF持久化机制详解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆想当图灵

嘿嘿,小赏就行,不赏俺也不争你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值