3. Redis基础数据类型

3.1 简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

3.2 Redis-Key

# 创建一个叫做name的键
set name qwe

# 获取key对应的value
get name

# 判断当前的key是否存在
exists name

# 将当前的key移动到几号数据库
move name 1

# 设置key的过期时间
expire name 10

# 查看当前key的剩余时间
ttl name

# 查询当前key的类型
type name

3.3 String

# 设置key1的值
set key1 "indi"

# 追加字符串,如果当前key不存在,就相当于set key
append key1 "hello"

# 获取字符串的长度!
strlen key1 

# 设置初始浏览量为0
set views 0

####################################################################

# 自增1
incr views

# 自减1
decr views

# 可以设置步长,指定增量
incrby views 10

# 也可以指定减量
decrby views 5

####################################################################

# 截取字符串,从下标0开始截取到下标3,
getrange key1 0 3

# 截取全部字符串
getrange key1 0 3

# 替换从指定位置开始的字符串
setrange key1 1 qwe

####################################################################

# 设置key1的值30秒过期
setex key1 30 "hello"

# 如果key1不存在的话设置值,如果存在,则创建失败
setnx key1 "hi"

# 批量设置值
mset k1 v1 k2 v2 k3 v3

# 批量获取值
mget k1 k2 k3

# 原子性操作,要么一起成功,要么一起失败
msetnx k1 v1 k4 v4

# 设置一个名为 user:1 的对象 值为json字符来保存一个对象
set user:1 {name:zhangsan, age:3} 

# 批量设置对象的值
mset user:1:name zhangsan user:1:age 2

# 批量获取对象的值
mget user:1:name user:1:age

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

3.4 List

# 将一个值或多个值,插入到列表头部(左)
lpush list one

# 获取list中的所有值
lrange list 0 -1

# 获取指定区间的值
lrange list 0 0

# 将一个值或多个值,插入到列表尾部(右)
rpush list four

# 移除左侧第一个元素
lpop list

# 移除右侧第一个元素
rpop list

# 通过下标获取list中的某个值
lindex list 0

# 返回列表的长度
llen list

# 移除list集合中指定个数的value,精确匹配
lrem list 1 one 

lrem list 2 three

# 通过下标截取list
ltrim list 0 1

# 移除列表的最后一个元素,将它移动到新的列表中
rpoplpush mylist myotherlist

# 将列表中指定下标的值替换为另外一个值,如果要替换的值或者列表不存在则会报错
lset list 0 "item"

# 将某一个具体的值插入到列表中某个元素的前面或者后面
linsert mylist before "world" "other"

linsert mylist after  "world" "qweqwe"

小结

  • List实际上是一个链表,before Node after,left,right都可以插入值
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表列表不存在!
  • 在两边插入或者改动值,效率最高!中间元素,效率相对低一点
  • 可以用它做消息排队,消息队列(lpush rpop),栈(lpush lpop)!

3.5 Set

set中的值无法重复

# 往set集合中添加元素
SADD myset "hello0"

# 查看指定set的所有值
SMEMBER myset

# 判断某一个值是否在set集合中,有则返回1,没有则返回0
SISMEMBER myset hello0

# 获取set集合中的元素个数
scard myset

# 移除set集合中的指定元素
srem myset hello

# 随机抽选出一个元素
SRANDMEMBER myset

# 随机抽选出指定个数的元素
SRANDMEMBER myset 2

# 随机删除key
spop myset

# 将一个指定的值,移动到另外一个set集合中
smove myset myset2 "hello"

# 差集:比较两个set集合,查询第一个集合中不同的元素
sdiff key1 key2

# 交集:查询两个set集合中相同的元素
sinter key1 key2

# 并集:去重查询两个set集合中所有的元素
sunion key1 key2

微博,A用户将所有关注的人放在了一个set集合中,将它的粉丝也放在一个集合中!

共同关注,共同爱好,共同好友,推荐好友,都可以使用set实现!

3.6 Hash

Map集合,key-map!这个值是一个map的集合,本质和String类型没有什么区别,还是一个简单地key-value

# 设置一个具体的key-value
127.0.0.1:6379> hset myhash field1 qwe
(integer) 1

# 获取对应的value
127.0.0.1:6379> hget myhash field1
"qwe"

# 设置或修改多个字段值
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK

# 获取多个字段值
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"

# 展示全部的key-value
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"

# 根据value删除
127.0.0.1:6379> hdel myhash field1
(integer) 1

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

# 获取hash表的字段数量
127.0.0.1:6379> hlen myhash
(integer) 1

# 判断hash中指定字段是否存在
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1

# 获取所有的字段
127.0.0.1:6379> HKEYS myhash
1) "field2"

# 获取所有的值
127.0.0.1:6379> HVALS myhash
1) "world"

# 指定增量
127.0.0.1:6379> HINCRBY myhash field1 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field1 -1
(integer) 5

# 判断值是否存在于hash中,如果不存在则创建,存在则不创建
127.0.0.1:6379> hsetnx myhash field2 hello
(integer) 0
127.0.0.1:6379> hsetnx myhash field3 hello
(integer) 1


# 存储对象
127.0.0.1:6379> hset user:1 name qwe
(integer) 1

# 获取对象
127.0.0.1:6379> hget user:1 name
"qwe"

hash最多应用在变更的数据上,尤其是用户信息的保存,经常变动的信息!所以hash更适合对象的存储,String则更加适合字符串存储。

3.7 Zset(有序集合)

在set的基础上增加了一个值,以实现排序等等

# 添加一个值
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1

# 添加多个值
127.0.0.1:6379> zadd myzset 3 three 4 four
(integer) 2

# 显示列表
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"

# 添加3个用户
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kua
(integer) 1

# 按照最小值到最大值排列所有用户
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "kua"
2) "xiaohong"
3) "zhangsan"

# 使用(代表<,不加代表<=,返回 0 < score <=600 的用户
127.0.0.1:6379> ZRANGEBYSCORE salary (0 600 withscores
1) "kua"
2) "500"


# 显示区间内用户,并且附带工资
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "kua"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"

# 从小到大排序
127.0.0.1:6379> zrange salary 0 -1
1) "kua"
2) "xiaohong"
3) "zhangsan"

# 从大到小排序
127.0.0.1:6379> zrevrange salary 0 -1
1) "zhangsan"
2) "xiaohong"
3) "kua"

# 移除有序集合中的指定元素
127.0.0.1:6379> zrem salary kua
(integer) 1

# 获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2

# 获取指定区间的成员数量
127.0.0.1:6379> zcount myset 1 3  # 获取指定区间的成员数量!
(integer) 3

适用于:set 排序、存储班级成绩表、工资表排序!

普通消息:1,重要消息:2,带权重进行判断!

排行榜应用实现,取Top N 测试!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值