ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis学习之旅--五大数据类型你都知道吗?

2022-01-13 11:58:55  阅读:122  来源: 互联网

标签:127.0 6379 -- 数据类型 Redis 0.1 list set integer


Redis学习之旅--五大数据类型

Redis-Key

以下是常见的Redis-Key的命令

127.0.0.1:6379> keys * #查看所有的key
(empty list or set)
127.0.0.1:6379> set name zjc #设置key
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys * 
1) "name"
2) "age"
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
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> expire name 10 #设置key的到期时间
(integer) 0
127.0.0.1:6379> ttl name	#查看key的到期时间
(integer) -2
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name 
(nil)
127.0.0.1:6379> type name	#查看key的类型
none
127.0.0.1:6379> type age
string

更多命令可以查看Redis的文档:http://www.redis.cn/commands.html

String(字符串)

127.0.0.1:6379> set key1 v1  #设置值
OK
127.0.0.1:6379> get key1	#获得值
"v1"
127.0.0.1:6379> keys *	#获得所有的key
1) "key1"
127.0.0.1:6379> exists key1	#判断一个key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" #追加字符串,若不存在则新set 可以去存储
(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 key2 "zjc"
(integer) 3
127.0.0.1:6379> keys *
1) "key1"
2) "key2"

=========================================
#自增、自减
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
(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"


=============================================

#字符串范围 range

127.0.0.1:6379> set key1 "hello,zjcjw" #设置key1的值
OK
127.0.0.1:6379> get key1  #得到key1的值
"hello,zjcjw"
127.0.0.1:6379> getrange key1 0 3 #截取字符串 [0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #获取全部的字符串和get key1一样
"hello,zjcjw"

#替换
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 xxx #替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxxefg"

=============================================
#setex(set with expire) 设置过期时间
#setnx(set if not exist) 不存在设置(在分布式锁中会常常用到)

127.0.0.1:6379> setex key3 30 "hello" #设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 25
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx key4 "redis" #如果key4不存在,创建key4(1表示成功)
(integer) 1
127.0.0.1:6379> keys *
1) "key4"
2) "key1"
3) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx key4 "zjc"	#如果key4存在,创建失败(0表示失败)
(integer) 0


======================================================
mset 设置多个set值
mget 获取多个set值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
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)
======================================
对象

127.0.0.1:6379> set user:1{name:zjc,age:3} #设置一个user:1对象  值为json字符老保存做一对象
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set user:1 {name:zjc,age:3}
OK
127.0.0.1:6379> get user:1
"{name:zjc,age:3}"
127.0.0.1:6379> mset user:2:name jw user:2:age 16
OK
127.0.0.1:6379> mget user:2:name user:2:age
1) "jw"
2) "16"
127.0.0.1:6379> 

======================================
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 mongdb #如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongdb"

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

  • ·计数器
  • ·统计多单位的数量
  • ·粉丝数 ·
  • 对象缓存存储

list(列表)

在Redis里面,我们可以将list玩成栈、队列、阻塞队列!
所有的list命令都是以l开头的

#push
127.0.0.1:6379> lpush list 1 #将一个值或者多个值插入到链表的头部(左)
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lrange list 0 1 #获取指定区间的值
1) "3"
2) "2"
127.0.0.1:6379> lrange list 0 -1  #获取list中的所有值
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush list 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1 #将一个值或者多个值插入到链表的尾部(右)
1) "3"
2) "2"
3) "1"
4) "4"


========================================================
#pop
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> lpop list  #移除list的第一个元素
"3"
127.0.0.1:6379> rpop list  #移除list的最后一个元素
"4"
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"


============================================
#index len
127.0.0.1:6379> lrange list 0 -1   #通过下标获取列表的值
1) "2"
2) "1"
127.0.0.1:6379> lindex list 1
"1"
127.0.0.1:6379> lindex list 0
"2"
127.0.0.1:6379> llen list   #获取列表的长度
(integer) 2

===========================================
#lrem
127.0.0.1:6379> lrem list 1 1  #移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> lrem list 2 4
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"


===========================================================

#trim 修剪

127.0.0.1:6379> lpush list "hello1"
(integer) 1
127.0.0.1:6379> lpush list "hello2"
(integer) 2
127.0.0.1:6379> lpush list "hello3"
(integer) 3
127.0.0.1:6379> lpush list "hello4"
(integer) 4
127.0.0.1:6379> ltrim list 1 2  #通过下标截取指定的长度 这个list已经被改变了,截断了只剩下未被截取的部分了
OK
127.0.0.1:6379> lrange list 0 -1
1) "hello3"
2) "hello2"


===================================================
#rpoplpush  #移除列表的最后一个元素,将他们移动到新的列表中!

127.0.0.1:6379> rpush list1 "hello1"
(integer) 1
127.0.0.1:6379> rpush list1 "hello2"
(integer) 2
127.0.0.1:6379> rpush list1 "hello3"
(integer) 3
127.0.0.1:6379> rpoplpush list1 list2   #移除列表的最后一个元素,将他们移动到新的列表中!
"hello3"
127.0.0.1:6379> lrange list1 0 -1   #查看原来的列表
1) "hello1"
2) "hello2"
127.0.0.1:6379> lrange list2 0 -1  #查看目标的列表中,确实存在该值!
1) "hello3"



===========================================================
#lset 将列表中指定下标的值替换为另一个值
127.0.0.1:6379> exists list	#判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lpush list value1   
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "value1"
127.0.0.1:6379> lset list 0 value0  #如果存在,更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "value0"
127.0.0.1:6379> lset list 1 value2	#如果不存在,我们更新的话会报错
(error) ERR index out of range


======================================================
#linsert #将某个具体的value插入到列表中某个元素的前边或者后边
127.0.0.1:6379> rpush list hello
(integer) 1
127.0.0.1:6379> rpush list world
(integer) 2
127.0.0.1:6379> linsert list before hello zjc #将某个具体的value插入到列表中某个元素的前边
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "zjc"
2) "hello"
3) "world"
127.0.0.1:6379> linsert list after world jw #将某个具体的value插入到列表中某个元素的后边
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "zjc"
2) "hello"
3) "world"
4) "jw"

小结

  • ·他实际上是一个链表,before Node after,left,right 都可以插入值 ·
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • ·如果移除了所有值,空链表,也代表不存在! ·在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点

list功能:消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)

Set(集合)

set无序不重复集合

127.0.0.1:6379> sadd set hello 	#往set集合中添加值
(integer) 1
127.0.0.1:6379> sadd set zjc
(integer) 1
127.0.0.1:6379> sadd set jw
(integer) 1
127.0.0.1:6379> smembers set  #查看置顶set的所有值
1) "hello"
2) "jw"
3) "zjc"
127.0.0.1:6379> sismember set hello 	#判断某一个值是不是在set集合当中(1为成功,0为失败)
(integer) 1
127.0.0.1:6379> sismember set world
(integer) 0
==============================================
127.0.0.1:6379> scard set  #查看set集合中元素的个数
(integer) 3
127.0.0.1:6379> smembers set
1) "hello"
2) "jw"
3) "zjc"
127.0.0.1:6379> srem set hello	#移除set集合中指定元素
(integer) 1
127.0.0.1:6379> smembers set
1) "jw"
2) "zjc"

==========================================
#srandmember 随机从set中抽取一个元素
127.0.0.1:6379> smembers set  #查看set集合中的所有元素
1) "2"
2) "1"
3) "jw"
4) "zjc"
5) "3"
127.0.0.1:6379> srandmember set  #所及抽选出一个元素
"jw"
127.0.0.1:6379> srandmember set
"3"
127.0.0.1:6379> srandmember set 2	#所及抽选出指定个数的元素
1) "2"
2) "1"
127.0.0.1:6379> srandmember set 2
1) "zjc"
2) "1"
=================================
#spop 删除随机的key
127.0.0.1:6379> smembers set
1) "jw"
2) "zjc"
3) "2"
4) "3"
5) "1"
127.0.0.1:6379> spop set #所及删除set中的元素
"jw"
127.0.0.1:6379> spop set
"3"
127.0.0.1:6379> smembers set
1) "zjc"
2) "2"
3) "1"

===================================
#smove 讲一个集合中指定的值移动到另一个集合当中
127.0.0.1:6379> smembers set
1) "zjc"
2) "2"
3) "1"
127.0.0.1:6379> sadd set2 set2
(integer) 1
127.0.0.1:6379> sadd set2 jw
(integer) 1
127.0.0.1:6379> smembers set2
1) "set2"
2) "jw"
127.0.0.1:6379> smove set set2 zjc   #讲一个集合中指定的值移动到另一个集合当中
(integer) 1
127.0.0.1:6379> smembers set
1) "2"
2) "1"
127.0.0.1:6379> smembers set2
1) "set2"
2) "zjc"
3) "jw"

================================================
数学集合 差集 sdiff 交集sinter 并集sunion
127.0.0.1:6379> sadd set1 a
(integer) 1
127.0.0.1:6379> sadd set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set2 c
(integer) 1
127.0.0.1:6379> sadd set2 d
(integer) 1
127.0.0.1:6379> sadd set2 e
(integer) 1
127.0.0.1:6379> smembers set1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> smembers set2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sdiff set1 set2 #差集
1) "b"
2) "a"
127.0.0.1:6379> sinter set1 set2	#交集
1) "c"
127.0.0.1:6379> sunion set1 set2	#并集
1) "b"
2) "c"
3) "a"
4) "e"
5) "d"

Hash(哈希)

Map集合,key-map!这个时候值是一个map集合!本质上和String类型没有太大的区别,还是一个简单的kay-value键值对(不过这个value是一个key-value)

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset hash1 f1 zjc #set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget hash1 f1 #获取一个字段的值
"zjc"
127.0.0.1:6379> hmset hash1 f1 hello f2 jw #set多个key-value
OK
127.0.0.1:6379> hmget hash1 f1 f2	#获取多个字段值
1) "hello"
2) "jw"
127.0.0.1:6379> hgetall hash1 	#获取全部的数据
1) "f1"
2) "hello"
3) "f2"
4) "jw"
127.0.0.1:6379> hdel hash1 f1	#删除hash指定key字段!对应value值也就消失了!
(integer) 1
127.0.0.1:6379> hgetall hash1
1) "f2"
2) "jw"
127.0.0.1:6379> hgetall hash1
1) "f1"
2) "hello"
3) "f2"
4) "jw"
127.0.0.1:6379> hdel hash1 f1  #删除hash中特定的值
(integer) 0
127.0.0.1:6379> hgetall hash1
1) "f2"
2) "jw"

=================================================
#heln hexists
127.0.0.1:6379> hgetall hash1
1) "f2"
2) "jw"
3) "f1"
4) "zjc"
127.0.0.1:6379> hlen hash1	#获取hash表的字段数量
(integer) 2
127.0.0.1:6379> hexists hash1 f1 #判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379> hexists hash1 f3
(integer) 0


================================
#hkeys hvals hincrby hsetnx
127.0.0.1:6379> hkeys hash1 #只获得所有的key
1) "f2"
2) "f1"
127.0.0.1:6379> hvals hash1	#只获得所有的value
1) "jw"
2) "zjc"
127.0.0.1:6379> hset hash1 f3 5	
(integer) 1
127.0.0.1:6379> hget hash1 f3
"5"
127.0.0.1:6379> hincrby hash1 f3 1	#指定增量
(integer) 6
127.0.0.1:6379> hget hash1 f3
"6"
127.0.0.1:6379> hsetnx hash1 f4 hello #设置指定的值,如果不存在则创建并设置
(integer) 1
127.0.0.1:6379> hsetnx hash1 f4 world	 #设置指定的值,如果存在则不能设置
(integer) 0
127.0.0.1:6379> hget hash1 f4
"hello"


Zset(有序集合)

在set的基础上,增加了一个值,set k1 v1 zset k1 score v1

127.0.0.1:6379> zadd set1 1 one		#添加一个值
(integer) 1
127.0.0.1:6379> zadd set1 2 two 	
(integer) 1
127.0.0.1:6379> zadd set1 3 three
(integer) 1
127.0.0.1:6379> zrange set1 0 -1	获取zset集合中的值
1) "one"
2) "two"
3) "three"

==================================================
127.0.0.1:6379> zadd socre 5000 zjc  #添加三个用户
(integer) 1
127.0.0.1:6379> zadd socre 2500 jw
(integer) 1
127.0.0.1:6379> zadd socre 100 ly
(integer) 1
127.0.0.1:6379> zrangebyscore socre -inf +inf #显示全部的用户,从小到大
1) "ly"
2) "jw"
3) "zjc"
127.0.0.1:6379> zrevrange socre 0 -1 #显示全部的用户,从大到小排序
1) "jw"
2) "ly"
127.0.0.1:6379> zrangebyscore socre -inf +inf withscores 	#显示全部的用户并且附带成绩
1) "ly"
2) "100"
3) "jw"
4) "2500"
5) "zjc"
6) "5000"
127.0.0.1:6379> zrangebyscore socre -inf 2500 withscores	#显示指定区间的用户并升序排序
1) "ly"
2) "100"
3) "jw"
4) "2500"

==============================================
#zrem zcard
127.0.0.1:6379> zrange socre 0 -1
1) "ly"
2) "jw"
3) "zjc"
127.0.0.1:6379> zrem socre zjc 	#移除有序集合中指定元素
(integer) 1
127.0.0.1:6379> zrange socre 0 -1
1) "ly"
2) "jw"
127.0.0.1:6379> zcard socre	#获取有序集合中的个数
(integer) 2

================================================
#zcount
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world
(integer) 1
127.0.0.1:6379> zadd myset 3 zjc
(integer) 1
127.0.0.1:6379> zcount myset 1 3 	#获取指定区间成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

案例思路:set排序 存储班级成绩表 工资表排序
普通消息1 重要消息 2带权重进行判断
排行榜应用 取Top测试!

标签:127.0,6379,--,数据类型,Redis,0.1,list,set,integer
来源: https://blog.csdn.net/qq_45661125/article/details/122437126

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有