Redis 8种基本数据类型及常用命令和数据类型的应用场景

小伙伴们好,欢迎关注,一起学习,无限进步
文章内容为学习的一些笔记及工作中遇到的一些问题

文章目录

    • Redis 五大数据类型
      • key
      • String
      • List
      • Set
      • Hash
      • Sorted Set
    • 三种特殊类型
      • Geospatial 地理位置
      • Hyperloglog
      • Bitmap

Redis 五大数据类型

redis 官方网张:https://redis.io/

redis 常用命令:https://www.redis.net.cn/order/

使用 SpringBoot。Jedis 连接的方法也是这些命令

key

# 验证 redis 服务密码
127.0.0.1:6379> auth 123456
# 查看 redis 节点信息
127.0.0.1:6379> info replication
# 测试是否连接 redis
127.0.0.1:6379> ping
# 查看所有的key
127.0.0.1:6379> keys * 
#关闭redis 
127.0.0.1:6379> shutdown
# 退出
127.0.0.1:6379> exit  
# 切换数据库
127.0.0.1:6379> select 3
# 查看DB大小
127.0.0.1:6379> DBSIZE  
# 清除当前数据库
127.0.0.1:6379> flushdb
# 清除全部数据库的内容
127.0.0.1:6379> flushall
# 判断当前的key是否存在
127.0.0.1:6379> exists name
127.0.0.1:6379> set name
# 移动key到第一个数据库
127.0.0.1:6379> move name 1
# 设置key的过期时间,单位是秒
127.0.0.1:6379> expite name 10
# 查看当前 key 的剩余时间
127.0.0.1:6379> ttl name  
# 查看当前key的一个类型
127.0.0.1:6379> type name

String

# 设置值
127.0.0.1:6379> set k1 v1  
# 获取值
127.0.0.1:6379> get k1  
# 获取所有的 key
127.0.0.1:6379> keys *
# 判断一个 key 是否存在
127.0.0.1:6379> exists k1
# 获取字符串的长度
127.0.0.1:6379> STRLEN key1
# 追加字符串,如果当前 key 不存在,就相当于set key
127.0.0.1:6379> APPEND k1 ",Hello"
# 初始浏览量为 0
127.0.0.1:6379> set views 0
# 自增1 浏览量变为1
127.0.0.1:6379> incr views
# 自减1  浏览量-1
127.0.0.1:6379> decr views
# 可以设置步长,指定增加10
127.0.0.1:6379> incrby views 10 
# 可以设置步长,指定减小10
127.0.0.1:6379> decrby views 10 
# 设置 k1 的值
127.0.0.1:6379> set k1 "hello,world"
# 截取字符串 [0,3]
127.0.0.1:6379> getrange k1 0 3
# 获取全部的字符串和 get key 是一样的
127.0.0.1:6379> getrange k1 0 -1
# 设置 k2 的值 "12345678"
127.0.0.1:6379> set k2 "12345678"
# 替换指定位置开始的字符串
127.0.0.1:6379> SETRANGE k2 1 xx# setex (set with expire)  # 设置过期时间
# setnx (set if not exist)  # 不存在在设置 (在分布式锁中会常常使用!)
# 设置key3 的值为 hello,30秒后过期
127.0.0.1:6379> setex k3 30 "hello" 
# 查看 k3 过期时间
127.0.0.1:6379> ttl k3
# 如果 k3 不存在,创建 k3
127.0.0.1:6379> setnx k3 "haha"
# 清除当前数据库的所有 key
127.0.0.1:6379> flushdb
# 同时设置多个值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  
# 同时获取多个值
127.0.0.1:6379> mget k1 k2 k3# msetnx 是一个原子性的操作,要么一起成功,要么一起失败 结果返回 0
127.0.0.1:6379> msetnx k1 v1 k4 v4# 对象 set user:1 {name:zhangsan,age:3}  设置一个user:1 对象值为 json 字符来保存一个对象
# 这里的key是一个巧妙的设计: user:{id}:{filed} , 如此设计在Redis中是完全OK了
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
# 获取对象中的值
127.0.0.1:6379> mget user:1:name user:1:age# getset  先get然后在set
# 如果不存在值,则返回 nil
127.0.0.1:6379> getset db redis
# 如果存在值,获取原来的值,并设置新的值
127.0.0.1:6379> getset db mongodb

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

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

List

基本的数据类型,列表,在redis里面,list 是一种比较灵活的链表数据结构,可以充当栈、队列、阻塞队列

list 列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的。意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。

# 将一个值或者多个值,插入到列表头部 (左)
127.0.0.1:6379> lpush list one
127.0.0.1:6379> lpush list one two three
# 获取 list 中的所有值
127.0.0.1:6379> lpush list 0 -1
# 通过区间获取具体的值
127.0.0.1:6379> lrange lisr 0 1
# 将一个值或者多个值,插入到列表位部 (右)
127.0.0.1:6379> rpush list righr# 通过下标获得 list 中的某一个值
127.0.0.1:6379> lindex list 1
# 返回 list 列表的长度
127.0.0.1:6379> llen list# 移除list的第一个元素
127.0.0.1:6379> lpop list
# 移除list的最后一个元素
127.0.0.1:6379> rpop list  
# 移除list集合中指定个数的value,精确匹配
127.0.0.1:6379> lrem list 1 one # trim 修剪 
# 新建一个 newlist 集合
127.0.0.1:6379> lpush newlist "hello" "hello1" "hello2" "hello3" "hello4"
# 通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素
127.0.0.1:6379> ltrim newlist 1 2# rpoplpush 移除列表的最后一个元素,将他移动到新的列表中
127.0.0.1:6379> rpush newlist "hello1"
# 移除列表的最后一个元素,将他移动到新的列表中
127.0.0.1:6379> rpoplpush another anotherlist
# 查看目标列表中,确实存在改值
127.0.0.1:6379> lrange anotherlist 0 -1 # lset 将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> exists list
# 如果不存在列表更新机会报错,更新前先检查列表是否存在(0表示下表索引)
127.0.0.1:6379> lset list 0 item
# 如果下标不存在,则会报错
127.0.0.1:6379> lset list 10 other# linsert 将某个具体的 value 插入到列表中某个元素的前面或者后面
127.0.0.1:6379> rpush list "hello"
127.0.0.1:6379> rpush list "world"
# 把 other 添加到 world 前面
127.0.0.1:6379> linsert list before "world" "other"
# 把 another 添加到 world 后面
127.0.0.1:6379> linsert list after "world" "another"

List 是一个链表,before , after , left,right 都可以插入值,在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点

使用场景:

  • 消息队列
  • 排行榜
  • 最新列表

Set

Sets: 不重复且无序的字符串元素的集合。

set 类型是 string 类型的集合,其特点是集合元素无序且不重复,每个集合最多可以存储 232 - 1 个元素(40多亿)

所有的 set 命令都是 s 开始

# 清空当前数据库
127.0.0.1:6379> flushdb
# set 集合中添加几个值
127.0.0.1:6379> sadd myset "1"
127.0.0.1:6379> sadd myset "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"
# 查看指定 set 的所有值
127.0.0.1:6379> smembers myset
# 判断某一个值是不是在 set 集合中
127.0.0.1:6379> sismember myset# 获取 set 集合中的内容元素个数
127.0.0.1:6379> scard myset
# 移除 set 集合中的指定元素
127.0.0.1:6379> srem myset 3# 随机抽选出一个元素,set 无序不重复集合。抽随机
127.0.0.1:6379> srandmember myset
# 随机抽取2个
127.0.0.1:6379> srandmember myset 2# 随机删除 myset 中的值
127.0.0.1:6379> spop myset# 将一个指定的值,移动到另外一个set集合
127.0.0.1:6379> sadd "hello"
127.0.0.1:6379> sadd "world"
127.0.0.1:6379> smove myset newset "hello"# 数字集合类 - 差集 sdiff - 交集 sinter - 并集 sunion
127.0.0.1:6379> sadd key1 "a" "b" "c"
127.0.0.1:6379> sadd key2 "c" "e" "f"
# 差集—— key1 在 key2 中没有的值
127.0.0.1:6379> sdiff key1 key2
# 交集—— key1 和 key2 共同拥有的值
127.0.0.1:6379> sinter key1 key2
# 并集—— key1 和 key2 所有的值
127.0.0.1:6379> sunion key1 key2

Set使用场景:

  • 共同关注,共同爱好,推荐好友,共同好友,共同喜好,二度好友,共同粉丝,微信点赞同好友可看,感兴趣的人集合
  • 兴趣标签,相同爱好的为一个标签
  • 统计网站的独立IP。利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。
  • 安全提示,群聊拉人的时候,新人入群的提示,如果被拉进群聊的新人除了拉取人之外,和其他群友都不是好友关系或者跟不超过N个人是好友关系的时候,就可以给一个安全提示。此时用到的是SISMEMBER

Hash

Map集合,key-maps 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的key-vlaue!

有点像 HashMap 的 value 又套了个HashMap

所有 hash 的命令都是 h 开头

# set一个具体 key-vlaue
127.0.0.1:6379> hset myhash field "hello
# 获取一个字段值
127.0.0.1:6379> hget myhash field
# set 多个 key-vlaue 返回 OK
127.0.0.1:6379> hmset myhash field1 "hello" field2 "world"
# set 多个 key-vlaue 返回成功的数量
127.0.0.1:6379> hset myhash field3 "hello" field4 "world"
# 获取多个字段值
127.0.0.1:6379> hmget myhash field1 field2
# 获取全部的数据
127.0.0.1:6379> hgetall myhash# 获取hash表的字段数量
127.0.0.1:6379> hlen myhash
# 判断hash中指定字段是否存在
127.0.0.1:6379> hexists myhash field1# 只获得所有 field
127.0.0.1:6379> hkeys myhash
# 只获得所有value
127.0.0.1:6379> hvals myhash# 指定增量
127.0.0.1:6379> hset myhash field5 5
127.0.0.1:6379> hincrby myhash field5 5
127.0.0.1:6379> hincrby myhash field5 -2# 如果不存在则可以设置,存在则不能设置
127.0.0.1:6379> hsetnx myhash field6 "hello"
# 删除指定的 field
127.0.0.1:6379>hdel myhash field# 返回 hash 指定 field 的 value 的字符串长度,field 不存在返回 0
127.0.0.1:6379> hstrlen myhash field1

hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的存储,String更加适合字符串存储

购物车的实现:field (商品id),hincrby (商品数量,添加增量会返回总数),hdel(删除),hgetall(全选),hlen(购物车车数量),key(用户id)

Hash 结构优点:

  • 同类数据归类整合存储,方便数据管理
  • 相比 String 操作消耗内存与 cpu 更小
  • 相比 String 储存更节省空间

缺点:

  • 过期功能不能使用在 field 上,只能用在 key 上
  • Redis 集群架构下不适合大规模使用

Sorted Set

Sorted-Set和Set类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Set中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Set中的成员必须是唯一的,但是分数(score)却是可以重复的

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

# 添加一个值
127.0.0.1:6379> zadd myzset 1 one 
# 添加多个值
127.0.0.1:6379> zadd myzset 2 two 3 three
# zincrby 和 zadd 效果一样,最后返回结果是字符串,zadd 返回添加总数# 查看添加的值
127.0.0.1:6379> zrange myzset 0 -1
127.0.0.1:6379> zrange myzset 0 -1 withscores# 实现排序 添加三个用户
127.0.0.1:6379>	zadd salary 120 zhang 98 wang 110 li
# ZRANGEBYSCORE key min max   显示全部的用户 从小到大
127.0.0.1:6379>	zrangebyscore salary -inf +inf
# 从大到进行排序
127.0.0.1:6379>	zrevrange salary 0 -1
# 显示全部的用户并且附带成绩
127.0.0.1:6379>	zrangebyscore salary -inf +inf withscores
# 显示成绩小于 110 的所有人,升序排序
127.0.0.1:6379>	zrangebyscore salary -inf 110 withscores
# zrem 移除,移除有序集合中的指定元素
127.0.0.1:6379> zrem salary zhang# 添加值
127.0.0.1:6379> zadd myzset 2 hello 3 world
# 有序集合的元素个数, key 不存在则返回0 
127.0.0.1:6379> zcard myzset
# 获取区间成员数量
127.0.0.1:6379> zcount myzset 1 3
# 计算成员之间的数量
127.0.0.1:6379> zlexcount myzset - +
127.0.0.1:6379> zlexcount myzset [b [f# 删除一个 zset -> del myzset
127.0.0.1:6379> del myzset

ZSet 数据类型使用场景:游戏排名、微博热点话题,根据时间排序的新闻列表, 阅读排行榜,延时队列等

限流,滑动窗口是限流常见的一种策略。如果我们把一个用户的 ID 作为 key 来定义一个 zset ,member 或者 score 可以都为访问时的时间戳。我们只需统计某个 key 下在指定时间戳区间内的个数,就能得到这个用户滑动窗口内访问频次,与最大通过次数比较,来决定是否允许通过。

三种特殊类型

Geospatial 地理位置

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作

常用命令:

命令描述
Redis GEOHASH 命令返回一个或多个位置元素的 Geohash 表示
Redis GEOPOS 命令从key里返回所有给定位置元素的位置(经度和纬度)
Redis GEODIST 命令返回两个给定位置之间的距离
Redis GEORADIUS 命令以给定的经纬度为中心, 找出某一半径内的元素
Redis GEOADD 命令将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
Redis GEORADIUSBYMEMBER 命令找出位于指定范围内的元素,中心点是由给定的位置元素决定

使用场景:

例如:微信位置共享,附近的人等地图功能

redis 127.0.0.1:6379>  GEOADD Sicily 13.361389 38.115556 "beijing" 15.087269 37.502669 "shanghai"
(integer) 2
redis 127.0.0.1:6379>  GEODIST Sicily beijing shanghai
"166274.15156960039"
redis 127.0.0.1:6379>  GEORADIUS Sicily 15 37 100 km
1) "shanghai"
redis 127.0.0.1:6379>  GEORADIUS Sicily 15 37 200 km
1) "beijing"
2) "shanghai"

Hyperloglog

使用场景:

统计注册的IP数,每日访问数,每天在线人数,搜索词条数等类似场景

命令描述
Redis Pgmerge 命令将多个 HyperLogLog 合并为一个 HyperLogLog
Redis Pfadd 命令添加指定元素到 HyperLogLog 中。
Redis Pfcount 命令返回给定 HyperLogLog 的基数估算值。

示例1:

redis 127.0.0.1:6379> PFADD mykey a b c d e f g h i j
(integer) 1
redis 127.0.0.1:6379> PFCOUNT mykey
(integer) 10

示例2:

redis 127.0.0.1:6379> PFADD hll1 foo bar zap a
(integer) 1
redis 127.0.0.1:6379> PFADD hll2 a b c foo
(integer) 1
redis 127.0.0.1:6379> PFMERGE hll3 hll1 hll2
OK
redis 127.0.0.1:6379> PFCOUNT hll3
(integer) 6

Bitmap

使用场景:

统计用户信息、活跃、不活跃、 登录 、 未登录、打卡、365打卡! 两个状态的,都可以使用 Bitmaps!

Bitmap 位图,数据结构,都是操作二进制位来进行记录,就只有0 和 1 两个状态!

365 天 = 365 bit 1字节 = 8bit 46 个字节左右!

# 使用 bitmap 记录周一到周日打卡
127.0.0.1:6379> setbit sign 0 1
127.0.0.1:6379> setbit sign 1 1
127.0.0.1:6379> setbit sign 2 1
127.0.0.1:6379> setbit sign 3 0
127.0.0.1:6379> setbit sign 4 1
127.0.0.1:6379> setbit sign 5 1
127.0.0.1:6379> setbit sign 6 1
# 查看那一天是否打卡
127.0.0.1:6379> getbit sign 3
127.0.0.1:6379> getbit sign 4# 统计这周的打卡记录,就可以看到是否有全勤
127.0.0.1:6379> bitcount sign

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的os库

一.OS库简介 OS是Operating System的简写,即操作系统。 OS库是一个操作系统接口模块,提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1:os.getcwd() 作用:返回当前工作目录,结果是…

Python中re(正则)模块的使用

re 是 Python 标准库中的一个模块,用于支持正则表达式操作。通过 re 模块,可以使用各种正则表达式来搜索、匹配和操作字符串数据。 使用 re 模块可以帮助在处理字符串时进行高效的搜索和替换操作,特别适用于需要处理文本数据的情况。 # 导入…

怎样把python字符串中的emoji表情包去掉或忽略?

要从Python字符串中去掉或忽略表情符号,可以使用正则表达式来过滤掉所有的Unicode码点大于\uFFFF的字符。这些字符通常是表情符号。 以下是一个示例代码: import redef remove_emojis(text):emoji_pattern re.compile("["u"\U0001F600…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

微信小程序开启横屏调试

我们先打开小程序项目 开启真机运行 目前是一个竖屏的 然后打开全局配置文件 app.json 给下面的 window 对象 下面加一个 pageOrientation 属性 值为 landscape 运行结果如下 然后 我们开启真机运行 此时 就变成了个横屏的效果

Android、ios 打包一键生成自定义尺寸应用图标

这里以uniapp 打包为例 这里是打包时分别需要使用的尺寸 打开一键生成应用图标 在线工具 一键生成应用图标https://icon.wuruihong.com/ 上传你的应用图标 上传后在这里添加你需要用到的尺寸 开始生成 下载你批量生成的图标

使用Python,networkx绘制有向层级结构图

使用Python,networkx绘制有向层级结构图 1. 效果图2. 源码2.1 tree.txt2.2 pyNetworkx.py参考 上一篇介绍了:1. 使用Python,networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 当前博客介绍: 2. 使用Python&#xff0c…

11408

果然很terrible

仿牛客网项目---社区首页的开发实现

从今天开始我们来写一个新项目,这个项目是一个完整的校园论坛的项目。主要功能模块:用户登录注册,帖子发布和热帖排行,点赞关注,发送私信,消息通知,社区搜索等。这篇文章我们先试着写一下用户的…

剑指offer面试题21 包含min函数的栈

考察点 双栈知识点 题目 分析 题目需要一个能够得到栈的最小元素的min函数,并且min函数,pop,push都要求是O(1)的时间复杂度。遇到栈思维要往双栈上考虑,这种情况一个栈肯定完成不了,需要一个辅助栈,既然…

个人玩航拍,如何申请无人机空域?

我们在《年会不能停》一文中,有分享我们在西岭雪山用无人机拍摄的照片和视频,有兴趣可以去回顾。 春节的时候,趁着回老家一趟,又将无人机带了回去,计划拍一下老家的风景。 原本以为穷乡僻壤的地方可以随便飞&#xf…

Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析

3. SpringBoot原理 SpringBoot使我们能够集中精力地去关注业务功能的开发,而不用过多地关注框架本身的配置使用。而我们前面所讲解的都是面向应用层面的技术,接下来我们开始学习SpringBoot的原理,这部分内容偏向于底层的原理分析。 在剖析Sp…

华为OD技术面试案例4-2024年

个人情况:985本,目标院校非计算机专业,情况比较特殊,23年11月研究生退学,电子信息类专业。 初识od:10月底打算退学的时候在智联、BOSS上疯狂投硬件方面的岗位。投了大概一两天后有德科和HW的HR打电话给我介…

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev,点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可(这里以Windows距离) 下载完成后 Next Next 安…

threejs 大场景下,对小模型进行贴图处理

接上篇小模型的删除☞threeJS 大模型中对小模型进行删除-CSDN博客 针对已有模型,根据数据状态进行贴图处理,例如:机房内电脑告警状态、电脑开关机状态下的不同状态贴图等 示例模型还是以丛林小屋为例:针对该模型中的树干进行贴图…

Android进阶之路 - RecyclerView停止滑动后Item自动居中(SnapHelper辅助类)

之前一直没注意 SnapHelper 辅助类的功能,去年的时候看到项目中仅通过俩行代码设置 RecyclerView 后就提升了用户体验,觉得还是很有必要了解一下,尝试过后才发现其 PagerSnapHelper、LinearSnapHelper 子类可以作用于不同场景,且听…

加速AI测试领域的进化,顶尖专家与名校教授强强联合,助你快速成为人工智能测试领域的精英

随着人工智能在各行各业的广泛应用,学习并掌握AI技术在软件测试中的应用变得至关重要。不仅能使你跟上行业的发展趋势,还能提升你的竞争力。而且,市场对具备AI测试技能的测试工程师的需求正日益增长,这使得掌握这些技能能够帮助你…

走进中国电车领跑企业“NI蔚来”丨共谋商业,共话ESG

期盼与热望将冬季的寒冷拂去,复旦大学-华盛顿大学EMBA项目迎来了一位新朋友——美国圣路易斯华盛顿大学奥林商学院的新任院长Michael Mazzeo教授。Mazzeo院长在上海进行了为期3天的访问。这里是 Mazzeo院长上任后国际访问交流之旅的第一站。      漫步校园&…

mysql锁的创建方式

在 MySQL 中,锁是用来控制多个用户对同一数据的访问。主要有两种类型的锁:表级锁和行级锁。MySQL 的锁定机制主要是通过 SQL 语句来实现的,而不是通过特定的锁定命令。下面是一些常见的锁相关的 SQL 操作方式:表级锁 MySQL 中,表级锁是最基本的锁策略,它会锁定整个表。一…

【Python_Zebra斑马打印机编程学习笔记(四)】ZPL的一些简单指令

ZPL的一些简单指令 ZPL的一些简单指令前言一、ZPL 介绍二、ZPL 语法解析1、标签开始、标签结束2、标签原点位置设置3、标签长度设置4、标签文本打印深度设置5、标签打印宽度设置6、标签方向设置7、标签元素定位8、标签绘制矩形9、标签输入字段10、标签设置字段字体、大小11、标…