我是
方圆
,励志写出好文章的博主
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持久化机制详解