5、Redis五大基本数据类型

1、官方的介绍

在这里插入图片描述

2、基本命令

set name dxz#设置键值对name=dxz
get name #得到name所对应的值
exists name#查看name是否存在
move name 1#移除name属性
key * #查看所有的key
expire name 10 #设置name键值对有效期为10s
ttl name #查看name键值对的有效时间

3、String(字符串)

  1. 90%的程序员只会使用redis的String类型
  2. 127.0.0.1:6379> set name v1
    OK
    127.0.0.1:6379> append name 'hello'#拼接字符串,如果不存在该字符串则新建一个。
    (integer) 7
    127.0.0.1:6379> string name
    (error) ERR unknown command `string`, with args beginning with: `name`, 
    127.0.0.1:6379> strlen name
    (integer) 7
    127.0.0.1:6379> 
    
    
  3. ##################################
    #数据增加或者减小
    127.0.0.1:6379> set views 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> incr views
    (integer) 2
    127.0.0.1:6379> get views
    "2"
    127.0.0.1:6379> decr views#自减1
    (integer) 1
    127.0.0.1:6379> incrby views 10#自增10
    (integer) 11
    127.0.0.1:6379> decrby views 5#自减5
    (integer) 6
    
    ###################################
    #字符串范围range
    127.0.0.1:6379> set key1 "hello"
    OK
    127.0.0.1:6379> get key1
    "hello"
    127.0.0.1:6379> GETRANGE key1 0 3
    "hell"
    127.0.0.1:6379> GETRANGE key1 0 -1
    "hello"
    127.0.0.1:6379> 
    
    #替换!
    127.0.0.1:6379> set key2 abcde
    OK
    127.0.0.1:6379> get key2
    "abcde"
    127.0.0.1:6379> SETRANGE key2 1 xx
    (integer) 5
    127.0.0.1:6379> get key2
    "axxde"
    ##################################
    # setex(set with expire) 设置过期时间
    # setnx(set if not exsit) 不存在再设置(在分布式锁中经常使用)
    127.0.0.1:6379> setex key3 30 "hello" #设置key3有30秒有效期
    OK
    127.0.0.1:6379> ttl key3
    (integer) 26
    127.0.0.1:6379> ttl key3
    (integer) 21
    127.0.0.1:6379> setnx key4 "redis" #如果当前的key不存在则新建
    (integer) 1
    127.0.0.1:6379> setnx key4 "MongoDB" #如果已经存在则不起作用
    (integer) 0
    127.0.0.1:6379> get key4
    "redis"
    #################################
    #同时设置多样值
    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
    OK
    127.0.0.1:6379> keys *
    1) "k1"
    2) "k3"
    3) "k2"
    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 #这个操作为一个原子性的操作,要成功一起成功,否则一起不成功
    (integer) 0
    127.0.0.1:6379> get key4
    (nil)
    
    #对象
    127.0.0.1:6379> set user:1 {name:xiaoduan,age3}
    OK
    
    #这是一种巧妙地设设计
    127.0.0.1:6379> mset user:2:name xiaoyan user:2:age 3
    OK
    127.0.0.1:6379> mget user:2:name user:2:age
    1) "xiaoyan"
    2) "3"
    127.0.0.1:6379> 
    
    ################################
    #getset先get后set
    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> getset k1 v1
    (nil)
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> getset k1 mongodb
    "v1"
    127.0.0.1:6379> get k1
    "mongodb"
    127.0.0.1:6379> 
    
    
    

    数据结构是相通的。

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

    • 计数器
    • 统计数量(多单位)
    • 粉丝数
    • 对象缓存存储!

4、List

  1. 基本数据类型,列表
  2. 所有的List都是以L开头的,
  3. 127.0.0.1:6379> flushdb#清空数据
    OK
    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> rpush list four#右边存储数据
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    4) "four"
    ##############################
    127.0.0.1:6379> lpop list#左边弹出一个值
    "three"
    127.0.0.1:6379> rpop list#右边弹出一个值
    "four"
    127.0.0.1:6379> 
    
    ##############################
    127.0.0.1:6379> lindex list 0#查看0对应的字段
    "two"
    127.0.0.1:6379> lindex list 1#查看1对应的字段
    "one"
    127.0.0.1:6379> llen list#查看List的长度
    (integer) 2
    #############################
    #移除指定的值  Lrem
    127.0.0.1:6379> lrem list 1 one #移除list中的One元素
    (integer) 1
    ############################
    trim修剪:list截断
    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> lpush mylist "hello1"
    (integer) 1
    127.0.0.1:6379> lpush mylist "hello11"
    (integer) 2
    127.0.0.1:6379> lpush mylist "hello12"
    (integer) 3
    127.0.0.1:6379> ltrim mylist 1 2 #通过下表截取指定的长度,这个list已经改变了,阶段了只剩下截取的元素
    OK
    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello11"
    ##############################
    #rpoplpush移除列表中最后一个元素,并将它放入新的列表
    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello11"
    2) "hello1"
    127.0.0.1:6379> rpoplpush mylist newlist #将mylist中的最后一个元素移除,并且将它移动到newlist中
    "hello1"
    127.0.0.1:6379> lrange mylist 0 -1 # 查看mylist中的所有的元素
    1) "hello11"
    127.0.0.1:6379> lrange newlist 0 -1 # 查看newlist中的所有的元素
    1) "hello1"
    
    ##############################
    lset将列表中指定下标的值替换为指定的值
    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> exists list #判断是否存在list
    (integer) 0
    127.0.0.1:6379> lset list 0 item #设置list第0个坐标的值
    (error) ERR no such key #显示没有当前的list
    127.0.0.1:6379> lpush list value1 #创建list并且push一个照顾值
    (integer) 1
    127.0.0.1:6379> lset list 0 item #将list中第0个元素改为item
    OK
    127.0.0.1:6379> lrange list 0 0 # 查看当前list中的元素
    1) "item"
    127.0.0.1:6379> lset list 1 other #设置list中的1号元素,但是1号元素并不存在,所以报错
    (error) ERR index out of range
    ##############################
    #linsert 将某一个具体的值插入到具体的位置
    (error) ERR wrong number of arguments for 'lrange' command
    127.0.0.1:6379> lrange list 0 -1
    1) "item"
    127.0.0.1:6379> linsert list after item after
    (integer) 2
    127.0.0.1:6379> linsert list before item before
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1
    1) "before"
    2) "item"
    3) "after"
    
    
    
    
  4. 小结
    • 他实际就是一个链表,before node after,left,right都可以插入
    • 如果key不存在,创建新的链表】
    • 如果key存在,新增内容
    • 如果移除了所有的值,空链表,也代表不存在
    • 在两边插入或者改动值,效率最高!中间元素,相对来说效率底一点
    • 消息队列!消息队列

5、Set(集合)

  1. set中的值不能重复
  2. #############################
    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> sadd set hello #set集合中添加元素
    (integer) 1
    127.0.0.1:6379> sadd set xiaoduan #
    (integer) 1
    127.0.0.1:6379> smembers set #查看set中的所有的元素
    1) "xiaoduan"
    2) "hello"
    127.0.0.1:6379> SISMEMBER set hello # 查看hello是否为set中的元素
    (integer) 1
    127.0.0.1:6379> SISMEMBER set hello1
    (integer) 0
    
    #############################
    127.0.0.1:6379> scard set #查看set中的元素有几个
    (integer) 2
    127.0.0.1:6379> srem set hello #移除set中的hello元素
    (integer) 1
    127.0.0.1:6379> scard set
    (integer) 1
    127.0.0.1:6379> smembers set
    1) "xiaoduan"
    127.0.0.1:6379> 
    #############################
    #set是一个无序不重复的,随机抽取
    #srandmember 
    127.0.0.1:6379> sadd set xaioyan
    (integer) 1
    127.0.0.1:6379> sadd set xiaoyan
    (integer) 1
    127.0.0.1:6379> sadd laosi
    (error) ERR wrong number of arguments for 'sadd' command
    127.0.0.1:6379> sadd set laosi
    (integer) 1
    127.0.0.1:6379> srandmember set #随机抽取一个元素
    "xiaoduan"
    127.0.0.1:6379> srandmember set 
    "laosi"
    127.0.0.1:6379> srandmember set 2 #随机查询n个元素
    1) "laosi"
    2) "xiaoyan"
    ##############################
    #删除指定的key,随机删除key
    127.0.0.1:6379> smembers set
    1) "xaioyan"
    2) "laosi"
    3) "xiaoduan"
    4) "xiaoyan"
    127.0.0.1:6379> spop set #随机删除元素
    "xiaoduan"
    127.0.0.1:6379> spop set
    "xiaoyan"
    127.0.0.1:6379> smembers set
    1) "xaioyan"
    2) "laosi"
    
    ##############################
    #将指定的一个元素移动到另外一个集合中
    127.0.0.1:6379> smembers set
    1) "xaioyan"
    2) "laosi"
    127.0.0.1:6379> sadd set2 myset
    (integer) 1
    127.0.0.1:6379> smove set set2 xaioyan #移动
    (integer) 1
    127.0.0.1:6379> smembers set2
    1) "xaioyan"
    2) "myset"
    
    ##############################
    #查看并集和差集
    127.0.0.1:6379> flushdb
    OK
    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> sdiff set1 set2 #查看set1中不包含set2的元素
    1) "a"
    2) "b"
    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) "b"
    3) "c"
    4) "d"
    
    #微博,A用户将所有的关注set集合中,将它的粉丝放在一个集合
    #共同关注,二度好友
    
    
    

6、Hash(哈希)

  1. map集合,key-Map集合!这时候这个值是一个map集合,本质与String没有太大的区别,还是一个简单的key-value
  2. set myhash field
  3. ############################
    127.0.0.1:6379> hset hash field1 xiaoduan #设置一个hash值
    (integer) 1
    127.0.0.1:6379> hget hash field1 #获取一个字段值
    "xiaoduan"
    127.0.0.1:6379> hmset hash field1 hello field2 world #批量设置hash map
    OK
    127.0.0.1:6379> hmget hash field1 field2 #批量得到hash中的字段值
    1) "hello"
    2) "world"
    127.0.0.1:6379> hgetall hash #获取hash中的所有值
    1) "field1"
    2) "hello"
    3) "field2"
    4) "world"
    127.0.0.1:6379> 
    
    ##############################
    #hlen获取hash中的长度
    127.0.0.1:6379> hlen hash
    (integer) 2
    
    ##############################
    #获取hash中的所有字段
    127.0.0.1:6379> hkeys hash 
    1) "field1"
    2) "field2"
    #获取hash中的所有值
    127.0.0.1:6379> hvals hash
    1) "hello"
    2) "world"
    
    ##############################
    #自增和自减
    #incr decr
    127.0.0.1:6379> hset hash field1 6 #设置hash中的field1 字段值为6
    (integer) 1
    127.0.0.1:6379> hincrby hash field1 1 #将hash中的field1字段值自增1
    (integer) 7
    127.0.0.1:6379> hincrby hash field1 -1 
    (integer) 6
    127.0.0.1:6379> hsetnx hash field2 hello #如果不存在field2就创建字段,否则不创建
    (integer) 1
    127.0.0.1:6379> hsetnx hash field2 world
    (integer) 0
    
    #############################
    #hash变更的数据user name gae,尤其是用户信息之类的,经常变动的信息!hash更适合于对象的存储,String更加社和字段串存储!!
    

7、Zset(有序集合)

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

  2. ##############################
    127.0.0.1:6379> zadd set 1 one
    (integer) 1
    127.0.0.1:6379> zadd set 2 two 3 three
    (integer) 2
    127.0.0.1:6379> zrange set 0 -1
    1) "one"
    2) "two"
    3) "three"
    ##############################
    #查找到该zset中的所有元素,并将它使用score进行排序,并且附带成绩,默认从小到大
    127.0.0.1:6379> zrangebyscore set -inf +inf withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    #进行从小到大进行排序
    127.0.0.1:6379> zrevrange set 0 -1
    1) "three"
    2) "two"
    3) "one"
    
    #显示小于等于2的员工
    127.0.0.1:6379> zrangebyscore set -inf 2 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    #获取集合中的数据个数
    127.0.0.1:6379> zcard set
    (integer) 3
    #获取指定区间的成员数量
    127.0.0.1:6379> zcount set 1 2
    (integer) 2
    127.0.0.1:6379> zcount set 1 3
    (integer) 3
    
    
    

    其余的很多API,可以去查找官方文档!

    案例思路:set排序,存储班级成绩表,工资表排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

躺平崽

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值