Redis的五种数据类型及应用场景

2023-11-20

1,数据类型

  • String(字符串,整数,浮点数):做简单的键值对缓存
  • List(列表):储存一些列表类型的数据结构
  • Set(无序集合):交集,并集,差集的操作
  • Hash(包含键值对的无序散列表):结构化的数据
  • Zset(有序集合)(Sorted sets):去重同时也可以排序,

1,String

​ String是redis最基本的数据类型,一个key对应一个value。redis的String可以表示任何数据。比如jpg图像或者序列化对象,String的最大储存值为512MB。

常用命令:

get,set,incr,decr,mget

set:往redis里面输入Key-Value,比如:输入Key为name,Value值为:zhangsan

127.0.0.1:6379> set name zhangsan
OK

get:输入key值,可返回value值

127.0.0.1:6379> get name
"zhangsan"

incr:自增1,比如

127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> incr age
(integer) 24
127.0.0.1:6379> get age
"24"

decr:自减

192.168.119.139:0>decr age 
"23"
192.168.119.139:0>get age
"23"

mget:一次获取多value值。

192.168.119.139:0>mget name age
 1)  "zhangsan"
 2)  "23"

在这里插入图片描述

在这里插入图片描述

2,List

常用命令

lpush,lpop,rpush,rpop,llen

lpush:从列表List的最左边插入一个元素

lpop:从列表List的左边移出一个元素

rpush:从列表List的右边插入一个元素

rpop:从列表List的右边移出一个元素

llen:打印当前列表List的元素个数

192.168.119.139:0>lpush list1 cat
"1"
192.168.119.139:0>lpush list1 n
"2"
192.168.119.139:0>llen list1
"2"
192.168.119.139:0>lpop list1
"n"
192.168.119.139:0>llen list1
"1"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfaSN1tx-1648872184359)(C:\Users\SIN2\AppData\Roaming\Typora\typora-user-images\image-20220402085533185.png)]

3,Set

常用命令

sadd,srem,scard,sismember

sadd:往set中添加数据

srem:从set中删除数据

scard:查看set中存在的元素个数

sismember:查看set中是否存在某个数据

192.168.119.139:0>sadd set1 sky
"1"
192.168.119.139:0>sadd set1 a
"1"
192.168.119.139:0>scard set1
"2"
192.168.119.139:0>sismember set a
"0"
192.168.119.139:0>sismember set1 a
"1" 
192.168.119.139:0>srem set1 a
"1"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkYANdbF-1648872184360)(C:\Users\SIN2\AppData\Roaming\Typora\typora-user-images\image-20220402085519463.png)]

4,Hash

常用命令

hget,hset,hmget

hget:通过key值,从hash里取对应的value

hset:往hash里,添加key-value

hmget:一次性获取多个key的value

192.168.119.139:0>hset hset1 name zhangsan
"1"
192.168.119.139:0>hset hset1 namg lisi
"1"
192.168.119.139:0>hset hset1 age 23
"1"
192.168.119.139:0>hmget hset1 name namg age
 1)  "zhangsan"
 2)  "lisi"
 3)  "23"

在这里插入图片描述

5,ZSet

​ 在redis中,set和zset都有元素的集合,都不允许有重复的元素,不同的是,zset的每个元素都会关联一个分数(分数可以重复),redis通过这个分数为集合中的成员进行排序。

常用命令

zadd,zcard,zrange,zrem,zrevrange

zadd:添加数据

192.168.119.139:0>zadd database 5 redis
"1"
192.168.119.139:0>zadd database 3 mysql
"1"
192.168.119.139:0>zadd database 1 mongodb
"1"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gqkay5Wb-1648872184363)(C:\Users\SIN2\AppData\Roaming\Typora\typora-user-images\image-20220402090224107.png)]

zrem:删除元素

192.168.119.139:0>zrem database redis
"1"

在这里插入图片描述

**zrem:**还可以删除多个数据

192.168.119.139:0>zrem database mysql mongodb
"2"

当删除了database中的所有数据后database都不存在了

192.168.119.139:0>zadd books 1 java
"1"
192.168.119.139:0>zadd books 3 go
"1"
192.168.119.139:0>zadd books 2 php
"1"
192.168.119.139:0>zadd books 5 mysql
"1"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5orZ0KB-1648872184365)(C:\Users\SIN2\AppData\Roaming\Typora\typora-user-images\image-20220402090955052.png)]

zcard:查询数据

192.168.119.139:0>zcard books
"4"

zrange:数据排序,根据分数从大到小

withscores表示用分数进行排序,下面命令的0,3表示排序的区间的是第0个到第三个元素

192.168.119.139:0>zrange books 0 3 withscores
 1)  "java"
 2)  "1"
 3)  "php"
 4)  "2"
 5)  "go"
 6)  "3"
 7)  "mysql"
 8)  "5"

zrevrange:数据排序,分数从大到小

192.168.119.139:0>zrevrange books 0 3 withscores
 1)  "mysql"
 2)  "5"
 3)  "go"
 4)  "3"
 5)  "php"
 6)  "2"
 7)  "java"
 8)  "1"

6,五种数据类型的原理

6.1,redis核心对象

​ **type:**用来表示这个redisObject是属于五种数据类型(String,set,list,hash,zset,)的哪一种,比如说type=String表示value储存的是一个普通的字符串。

encoding:表示type的底层数据结构是用什么实现的,比如Java中的list的是有ArrayList来实现的,

List list = new ArrayList();

List list = new LinkedList();

ptr:指向底层数据结构的指针

vm:打开reids的虚拟内存功能,此字段才回真正的分配内存,该功能是默认关闭的。

6.2,redisObject如何表示String(各个encoding方式解释)

​ 字符串的encoding有三种方式:

  • int
  • raw
  • embstr

int

​ 如果一个字符串String保存的是整数值,如:set age 13,那么这个整数值可以用long类型标识。那么该字符串的redisObject回把13这个整数值保存在ptr属性中,并将encoding设置为int,

raw

​ 如果字符串String保存的是一个字符串值,并且字符串大于39个字节,那么这个字符串对象将使用一个

简单动态字符串(SDS)来保存这个字符串,并将redisObject的encoding设置为raw

embstr

​ 如果字符串String保存的是一个字符串值,并且字符串小于39个字节那么字符串将使用embstr编码的方式来储存这个字符串。

embstr对别raw的优点:

  • embast创建字符串对象(redisObject)的次数只需要一次,而raw是两次(redisObjcet和sds分开分配)
  • embast调用释放内存的函数一次,rew编码的字符串对象要少一次
  • 由于embast编码是内存的连续性的,而raw不是连续的,因此embast存,取是的速度比较快

6.3,redisObject如何标识List

​ 列表对象list的编码方式encoding有两种,ziplist,linkedlist

ziplist(压缩列表)

​ 压缩列表是节省内存而设计的内存结构(是redis创建的),

优点:

  • 节省内存

缺点:

  • 比其他结构要消耗跟多的时间,所以redis在数据量少的时候使用压缩列表储存。

​ 列表长度少于512,并且所有元素的长度都少于64字节时,使用使用ziplist(压缩列表)储存,相反会使用lindedList使用

ziplist节省内存的原理

​ 普通数据能够支持随机访问的原因时储存的内存时连续的,但是有一个问题,就是数组中每一个元素的大小都是必须相同的,如果大小不一样的化,那么该元素的内存就必须按照数组中最大的元素(假设是五个字节)的内存存放,那么储存少于5ge字节的元素就会存在内存浪费问题。

linkedlist

​ 列表长度少于512,并且所有元素的长度都少于64字节时,使用使用ziplist(压缩列表)储存,相反会使用lindedList使用

6.4,intset

​ 当集合的长度少于512时,并且所有的元素地时整数时,使用intset储存,否则使用hashtable

2,五种数据类型的应用场景

string的应用场景

​ 普通的key-value键值对都可以用string来保存,

​ 1,访问量统计,每次访问博客和文章的,都用intr命令加一

​ 2,做缓存。

list的应用场景

​ 作为队列,list的两端操作比较方便,所以可以用来一些需要获取最新数据的场景。比如新闻类应用的最新新闻。

hash的应用场景

​ 用来储存,修改对象属性,如果说用户(name,age,like),文章(标题,time,作者,内容,),其中用户相当于key,而(name,age,;like)相当于vlaue

set的应用场景

​ 1,好友推荐,根据set的内容交集,大于每个值就可以推荐,

​ 2,利用set的唯一性,统计网站内容所有独立ip

zset的应用场景

​ 排行榜,因为zset时有序的

在程序中Redis的数据类型分别有什么作用

  • String:缓存,限流,计数器,分布式锁,分布式Session
  • Hash:储存用户信息,用户主页访问量,组合查询
  • List:微博关注人时间轴列表,简单队列
  • Set:赞,踩,标签,好友关系
  • Zset:排行榜

关注老爷点个赞
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis的五种数据类型及应用场景 的相关文章

  • 如何在实时添加对象时从 Redis 中弹出对象?

    我想让 Node js 进程运行 因为它正在检查 Redis 服务器是否有任何新的弹出内容 另一个进程将偶尔进行推送 而 Node 进程将尝试弹出任何进来的内容 Node 进程将保持运行 有人能给我指出一个好的方向吗 我正在尝试找出如何监听
  • 有没有办法在 Redis 和关系数据库中使用带有 @RedisHash 的实体?

    我正在使用Spring引导 为了将我的实体保存在关系数据库上 我配置了一个数据源和我的域类 例如 Entity Table schema schema name name tb name public class table name ex
  • StackExchange.Redis 和 StackExchange.Redis.StrongName 之间有什么区别?

    当我关注Azure时文档 http azure microsoft com en us documentation articles cache dotnet how to use azure redis cache 关于如何在Azure
  • 找不到模块“socket.io/node_modules/redis”

    当尝试做的时候 var redis require socket io node modules redis 我收到错误 找不到模块 socket io node modules redis 我不明白为什么 我正在运行 Windows 并运
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • 如何使用Spring Cache处理redis异常?

    我目前正在开发一个包含 Spring Data Redis 和 Spring Cache 的项目 在spring data redis中 我使用redis模板调用redis 我在 try catch 块中处理 redis 模板抛出的所有异常
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据

随机推荐