【Redis】五大数据类型

Redis五大数据类型


查看当前进程

ps -ef |grep redis #当前进程

开启redis服务

(base) flora@MAC-3DGroup:~$ cd ~/myredis
(base) flora@MAC-3DGroup:~/myredis$ redis-server ./redis.conf

连接

redis-cli -p 6379

在这里插入图片描述

String

使用场景:

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

设置key 获取key

get获取 set设置

get获得key值
set设置key值
exists 是否存在

set k1 v1 
get key 

127.0.0.1:6379> set k1 v1 # 设置值
OK
127.0.0.1:6379> get k1 # 获得值
"v1"
127.0.0.1:6379> exists k1 #判断key 是否存在 
(integer) 1

getset 先get再set

127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #获取原来值 并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"

mget mset 同时设置、获取多个值

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量设置值
OK
127.0.0.1:6379> mget k1 k2 k3 #批量获取值
1) "v1"
2) "v2"
3) "v3"

mset 设置对象值的例子


setnx msetnx 不存在设置

setnx key 不存在设置
一般在分布式锁使用

127.0.0.1:6379> setnx k3 djsa #k3不存在 设置成功
(integer) 1
127.0.0.1:6379> setnx k3 aaaa #k3存在 设置失败 
(integer) 0

msetnx k1 v1 k2 v2 批量设置
msetnx 是原子性操作,要么一起成功要么一起失败
也就是设置的key只要有一个是存在的,那所有的key都不能设置

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 #不存在key 设置 k1存在 设置失败
(integer) 0
127.0.0.1:6379> get k4 # 设置失败
(nil)
127.0.0.1:6379> get k1 #k1 还是原来的值
"v1"

setex 设置过期时间

setex(set with expire) 设置过期时间
ttl 剩余的时间

127.0.0.1:6379> setex key3 30 hello #设置key3 的过期时间是30s
OK
127.0.0.1:6379> ttl key3 # key3剩余的时间
(integer) 25

append 追加

append 在key后追加字符串,如果key不存在 相当于set key

127.0.0.1:6379> append k1 hahahas
(integer) 9
127.0.0.1:6379> get k1
"v1hahahas"

strlen 获取长度

127.0.0.1:6379> strlen k1
(integer) 9

i++

  1. incr 加1
    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
    
  2. decr 减1
    127.0.0.1:6379> decr views # 减1操作
    (integer) 1
    127.0.0.1:6379> decr views
    (integer) 0
    
  3. incrby 加指定的值 decrby 减指定的值
    127.0.0.1:6379> decr views
    (integer) -1
    127.0.0.1:6379> incrby views 9 #指定增量
    (integer) 8
    127.0.0.1:6379> decrby views 5 # 指定减量
    (integer) 3
    

字符串范围

getrange 获得指定范围字符串

127.0.0.1:6379> set key1 hello,hahaha
OK
127.0.0.1:6379> get key1
"hello,hahaha"
127.0.0.1:6379> getrange key1 0 3 # 截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #获取全部字符串,等价于get key
"hello,hahaha"

setrange 替换 指定位置开始的字符串

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 xx #把从1开始的字符串换成xx
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
127.0.0.1:6379>

list

所有的list命令都是以l开头(也有r)的

实际是一个双向链表

使用场景:

  • 消息排队
  • 消息队列

插入

lpush 从左边插入,插入到列表头部

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

rpush 从右边插入

将一个值或者多个值,插入到列表尾部(右)

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"

linsert 指定值 前/后插入

linsert 在指定值的前面 或后面插入值

127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert mylist before world other #在world前插入other
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after world new # 在world 后插入new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"

rpoplpush 移除列表的最后一个元素

rpoplpush mylist myotherlist 把mylist 的最后一个元素移除,移到myotherlist中

127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "hello2"
127.0.0.1:6379>

移除

lpop rpop 从头或尾移除

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

lrem 移除指定的值

lrem key count value 移除list集合中指定个数的value

127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "three"
3) "three"
4) "two"
127.0.0.1:6379> lrem list 1 one #移除list中one
(integer) 1
127.0.0.1:6379> lrem list 2 three #移除两个 值为 three的
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"

ltrim 截取区间内的值

ltrim 通过下标截取指定的长度,这个list已经被改变了,截取了只剩下截取的元素

127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> ltrim mylist 1 2 #截取[1,2] 内的值
OK
127.0.0.1:6379> lrange mylist 0 -1 # 截取后的值
1) "hello1"
2) "hello2"

更新

lset 将列表中指定下标的值替换为另外一个值
如果指定下标不存在 就会报错

127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lset mylist 0 hahaha #更新下标为0的值
OK
127.0.0.1:6379> lrange mylist 0 -1 
1) "hahaha"
2) "hello1"
127.0.0.1:6379> lset mylist 2 hahaha #索引不存在报错
(error) ERR index out of range

获取值

lrange 获取区间内的值

127.0.0.1:6379> lrange list 0 -1 #获取list中所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 2
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #可以看到是 符合先进后出 
1) "three"
2) "two"

lindex 通过下标获取值

127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 2
(nil)
127.0.0.1:6379> lindex list 0
"two"

llen 获取长度

127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> llen list
(integer) 2

Set(集合)

set中的值不能重复
set 都是以s开头的

添加

sadd 添加元素

127.0.0.1:6379> sadd myset hello #向set中添加值
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset loveworld
(integer) 1
127.0.0.1:6379> smembers myset #查看所有值
1) "world"
2) "hello"
3) "loveworld"

移除

srem 移除指定元素

127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> srem myset hello # 移除元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "loveworld"

spop 随机删除元素

127.0.0.1:6379> SMEMBERS myset
1) "hhaha"
2) "world"
3) "loveworld"
127.0.0.1:6379> spop myset
"world"

smove 将一个指定的值移到另一个集合

127.0.0.1:6379> smembers myset2
1) "set2"
127.0.0.1:6379> smembers myset
1) "hhaha"
2) "loveworld"
127.0.0.1:6379> smove myset myset2 loveworld #将myset 的loveworld移到myset2
(integer) 1
127.0.0.1:6379> smembers myset
1) "hhaha"
127.0.0.1:6379> smembers myset2
1) "set2"
2) "loveworld"

获取

smembers 查看指定set的所有值


127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"

sismember 判断一个值是不是在set中

127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> sismember myset hello #hello是否在集合myset中
(integer) 1

srandmember 随机抽取指定个数的元素

127.0.0.1:6379> smembers myset
1) "hhaha"
2) "world"
3) "loveworld"
127.0.0.1:6379> SRANDMEMBER myset #随机抽取一个元素
"hhaha"
127.0.0.1:6379> SRANDMEMBER myset #随机抽取一个元素
"world"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽取两个元素
1) "world"
2) "hhaha"

scard 获取set集合中的个数

127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> scard myset
(integer) 3

交并补

sdiff 差集
sunion 并集
sinter 交集


127.0.0.1:6379> SMEMBERS set1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SMEMBERS set2
1) "f"
2) "d"
3) "c"
127.0.0.1:6379> sdiff set1 set2 #差集
1) "a"
2) "b"
127.0.0.1:6379> sinter set1 set2 #交集
1) "c"
127.0.0.1:6379> sunion set1 set2 #并集
1) "f"
2) "b"
3) "c"
4) "a"
5) "d"

hash

map集合 key -map 这时候值是一个map集合

应用场景:
hash变更的数据 ,如用户信息的保存 user name age
hash更适合对象的存储

设置

hset

127.0.0.1:6379> hset myhash field1 ks
(integer) 1

hmset 同时设置多个值

127.0.0.1:6379> HMSET myhash field1 hello field2 world
OK

hsetnx 不存在设置

127.0.0.1:6379> hsetnx myhash field4 hello #不存在field4 设置成功
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 hello2 #存在field4 设置失败
(integer) 0

获取

hget

127.0.0.1:6379> hget myhash field1
"ks"

hmget 同时获取多个值

127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"

获取键、值

hgetall 获取所有键值对

127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"

hkeys 获取所有key

127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field3"
3) "field1"

hvals 获取所有值

127.0.0.1:6379> hvals myhash
1) "hhaha"
2) "hhaha"
3) "11hhaha"

hexists 指定key是否存在

127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> HEXISTS myhash field1
(integer) 0
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379>

hlen 获取长度

127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1

删除

hdel 删除指定key

key删除了 指定的值也就没有了

127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 #删除指定key
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"

自增 自减

127.0.0.1:6379> hset myhash field9 5
(integer) 1
127.0.0.1:6379> hincrby myhash field9 1 # 自增1
(integer) 6
127.0.0.1:6379> hincrby myhash field9 -1 #减1
(integer) 5

Zset(有序集合)

在set的基础上,增加了一个值 set k1 v1
应用场景:

  • 排行榜应用实现
  • 普通消息、重要消息 带权重进行判断
  • 存储班级成绩表,工资表排序进行判断

添加

zadd

127.0.0.1:6379> zadd  myset 1 one
(integer) 1
127.0.0.1:6379> zadd  myset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"

移除

zrem

127.0.0.1:6379> zrange salary 0 -1
1) "ks"
2) "xi"
3) "xixi"
127.0.0.1:6379> zrem salary ks
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xi"
2) "xixi"

获取

zrange 获取指定区间的值

127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"

排序

zrangebyscore 按score从小到大排序

127.0.0.1:6379> zadd salary 2500 xi
(integer) 1
127.0.0.1:6379> zadd salary 25200 xixi
(integer) 1
127.0.0.1:6379> zadd salary 200 ks
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #从小到大排序
1) "ks"
2) "xi"
3) "xixi"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #排序且显示score
1) "ks" 
2) "200"
3) "xi"
4) "2500"

zrevrange 从大到小排序

127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores
1) "xixi"
2) "25200"
3) "xi"
4) "2500"
5) "ks"
6) "2222"

获取数量

zcard 获取整个set的个数

127.0.0.1:6379> zcard salary
(integer) 2

zcount 获取指定区间的成员数量

127.0.0.1:6379> zcount salary 200 300 # 这个区间内没有符合的
(integer) 0
127.0.0.1:6379> zcount salary 200 3009 # 整个区间内有两个符合条件的
(integer) 2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章