Redis的五大数据类型(一)

2023-11-18

1、字符串类型:string

(1)添加、查询

  • 添加数据:set key value(如果key已存在,之前的value将会被覆盖)

  • 查询指定key的值:get key

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> set k "hello world"
OK
127.0.0.1:6379> set k hello world
(error) ERR syntax error
127.0.0.1:6379> set k hello,world
OK
127.0.0.1:6379> get k
"hello,world"

注意:插入的数据中如果有空格的数据,需要用“ ”双引号或者改为逗号分隔,因为在Redis中空格就是分隔符,相当于该参数已结束。

(2)追加、获取长度、判断是否存在

  • 追加字符串:append key value(返回字符串长度,如果key不存在,则存储为新的key)

  • 获取字符串长度:strlen key

  • 判断是否存在:exists key(存在返回1,不存在返回0)

127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> strlen name
(integer) 8
127.0.0.1:6379> append name ,lisi
(integer) 13
127.0.0.1:6379> get name
"zhangsan,lisi"

注意:追加字符串时,如果key存在,可以再value前加上适合的符号进行拼接。

(3)加、减操作

  • 将value数值加一:incr key(返回计算后的值,如果该值不是数值,将报错;如果key不存在,则自动存储新的key,并初始化为0,然后加一)
  • 将value数值减一:decr key(用法同上)
  • 将value数值加某一具体值:incrby key increment
  • 将value数值减某一具体值:decrby key increment
127.0.0.1:6379> get k1
"15"
127.0.0.1:6379> incr k1
(integer) 16
127.0.0.1:6379> decr k1
(integer) 15
127.0.0.1:6379> incrby k1 10
(integer) 25
127.0.0.1:6379> decrby k1 15
(integer) 10

(4)截取、替换操作

  • 闭区间截取字符串中的某一段:getrange key startIndex endIndex(下标从0开始,最后一个字符的下标为-1或字符串长度减1)

  • 用新的value覆盖从某一下标开始的字符串:setrange key offset value

127.0.0.1:6379> get name
"zhangsan,lisi"
127.0.0.1:6379> getrange name 0 7
"zhangsan"
127.0.0.1:6379> setrange name 9 hhhh
(integer) 13
127.0.0.1:6379> get name
"zhangsan,hhhh"

(5)设置过期时间、不存在设置

  • 添加新的数据并同时设置生命周期:setex key seconds value(跟expire的区别是前者设置已存在的key的过期时间,而setex是在创建的时候设置过期时间,返回-2证明该key已过期)

  • 当key值不存在时添加数据:setnx key value(key值不存在时添加,返回结果1;key值已存在不添加,返回结果0)

127.0.0.1:6379> setex kk 15 8
OK
127.0.0.1:6379> ttl kk
(integer) 11
127.0.0.1:6379> ttl kk
(integer) 5
127.0.0.1:6379> ttl kk
(integer) -2
127.0.0.1:6379> setnx kk 88
(integer) 1
127.0.0.1:6379> setnx kk 66
(integer) 0

(6)批量(添加新数据、获取数据、添加key不存在的数据)

  • 批量添加新的数据:mset key1 value1 key2 value2 key3 value3(中间使用空格隔开)

  • 批量获取数据:mget key1 key2 key3 (中间使用空格隔开)

  • 批量添加key不存在的数据:msetnx key1 value1 key2 value2 (所有key都不存在设则置成功,返回1;只要有一个存在则设置失败,返回0)

127.0.0.1:6379> mset k1 12 k2 15 k3 18
OK
127.0.0.1:6379> mget k1 k2 k3
1) "12"
2) "15"
3) "18"
127.0.0.1:6379> msetnx k1 5 k4 8
(integer) 0
127.0.0.1:6379> msetnx k4 8 k5 12
(integer) 1
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "12"
2) "15"
3) "18"
4) "8"
5) "12"

总结:String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。可以在缓存、计数器、用户会话、分布式锁等场景进行应用,需要注意的是,Redis 的字符串类型是二进制安全的,可以存储任意数据,不限于文本。但对于大型数据或频繁的字符串操作,需要考虑内存消耗和性能影响。

2、列表类型:list(有序可重复列表)

(1)lpush(左插入)、lrange(查询集合)、rpush(右插入)操作

  • 将一个或多个值依次插入列表的表头:lpush key value1 value2 …(若该key已存在,将新值追加在原来的列表中)(l:left)

  • 获取列表中指定下标区间的元素:lrange key startIndex endIndex

  • 将一个或多个值依次插入列表的表尾:rpush key value1 value2 …(若该key已存在,将新值追加在原来的列表中)(r:right)

#lpush(左插入)
127.0.0.1:6379> lpush list v1
(integer) 1
127.0.0.1:6379> lpush list v2
(integer) 2
127.0.0.1:6379> lpush list v3
(integer) 3

#lrange
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lpush list1 v1 v2 v3 v4 v5  #批量添加集合元素
(integer) 5
127.0.0.1:6379> lrange list1 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> lrange list 0 1  #指定查询列表中的元素,从下标零开始,1结束,两个元素
1) "v3"
2) "v2"
127.0.0.1:6379> lrange list 0 0  #指定查询列表中的唯一元素
1) "v3"

#rpush(右插入)
127.0.0.1:6379> rpush list v1
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "v1"

(2)lpop(左移除)、rpop(右移除)操作

  • 删除指定列表的表头元素并返回:lpop key

  • 删除指定列表的表尾元素并返回:rpop key

#lpop
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "v1"
127.0.0.1:6379> lpop list
"v3"

#rpop
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v1"
3) "v1"
127.0.0.1:6379> rpop list
"v1"
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v1"

(3)lindex(查询指定下标元素)、llen(获取集合长度) 操作

  • 获取指定列表中指定下标的元素并返回:lindex key index

  • 获取指定列表的长度:llen key

#lindex
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v1"
127.0.0.1:6379> lindex list 1  #获取指定下标位置集合的元素,下标从0开始计数
"v1"
127.0.0.1:6379> lindex list 0
"v2"

#llen
127.0.0.1:6379> llen list   #获取指定集合的元素长度
(integer) 2

(4)lrem(根据value移除指定的值)

根据count的值移除列表中的指定的某一些元素:lrem key count value

(count>0:从表头开始数前n个;count<0:从表尾开始数前n个;count=0:移除所有跟value相同的元素)

127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v5"
3) "v2"
4) "v3"
5) "v2"
6) "v2"
7) "v1"
8) "v2"
9) "v1"

#count>0
127.0.0.1:6379> lrem list 1 v3
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v2"
3) "v3"
4) "v2"
5) "v2"
6) "v1"
7) "v2"
8) "v1"

#count<0
127.0.0.1:6379> lrem list -1 v1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v2"
3) "v3"
4) "v2"
5) "v2"
6) "v1"
7) "v2"

#count=0
127.0.0.1:6379> lrem list 0 v2
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v3"
3) "v1"

(5)ltrim(截取元素)、rpoplpush(移除指定集合中最后一个元素到一个新的集合中)操作

#ltrim
127.0.0.1:6379> lpush list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> ltrim list 1 2  #通过下标截取指定的长度,这个list已经被改变了,只剩下截取后的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"

#rpoplpush
127.0.0.1:6379> lpush list v1 v2 v3 v4 v5
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> rpoplpush list newlist  #移除list集合中的最后一个元素到新的集合newlist中,返回值是移除的最后一个元素值
"v1"
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> lrange newlist 0 -1  
1) "v1"

(6)lset(更新)、linsert操作

#lset
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> lset list 1 newv4  #更新list集合中下标为‘1’的元素为‘newv4’
OK
127.0.0.1:6379> lrange list 0 -1  #查看证明更新成功
1) "v5"
2) "newv4"
3) "v3"
4) "v2"

#注意:
127.0.0.1:6379> lset list1 0 newv1  #如果指定的‘集合’不存在,报错
(error) ERR no such key
127.0.0.1:6379> lset list 6 newv1  #如果集合存在,但是指定的‘下标’不存在,报错
(error) ERR index out of range


#linsert
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "newv4"
3) "v3"
4) "v2"
127.0.0.1:6379> linsert list after v3 insertv3  #在集合中‘v3’元素之后加上一个元素
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "newv4"
3) "v3"
4) "insertv3"
5) "v2"
127.0.0.1:6379> linsert list before v3 insertv3  #在集合中‘v3’元素之前加上一个元素
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "newv4"
3) "insertv3"
4) "v3"
5) "insertv3"
6) "v2"

总结:可以应用在消息队列、实时聊天、最新动态、排行榜等场景。

传送门----Redis的五大数据类型(二)

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

Redis的五大数据类型(一) 的相关文章

  • 在 aws 微实例上安装 redis

    我需要在亚马逊云中安装redis 我需要它作为我的 npm 模块 kue 部署 的一部分 考虑到我对 Linux 和管理的了解并不好 任何人都可以链接我的逐步教程或解释如何做到这一点 如果您启用 Amazon Linux 上存在的 Extr
  • 即使增加超时后,stackexchange.redis 也会抛出超时?

    尝试从缓存中删除时出现以下错误 Timeout performing DEL test com inst 0 mgr ExecuteSelect err never queue 0 qu 0 qs 0 qc 0 wr 0 wq 0 in 0
  • 在节点中使用redis获取hash key的所有字段和值

    红色是使用哈希 我需要存储具有多个字段和值的哈希键 我尝试如下 client hmset Table1 Id 9324324 ReqNo 23432 redis print client hmset Table1 Id 9324325 Re
  • Redis多插入问题

    我尝试多次插入 但它给了我错误 http pastie org 7337421 http pastie org 7337421 cat mass insert txt 3 r n 3 r nSET r n 3 r nkey r n 5 r
  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大

随机推荐

  • Vue--ElementUI组件库

    1 概述 Element官网 ElementUI是饿了么前端团队推出的一款基于Vue桌面端UI框架 和Boostrap一样对原生的HTML标签进行了封装 美化 让我们能够专注于业务逻辑而不是UI界面 默认情况下无论我们有没有使用到某个组件
  • JVM类加载器的urlclassloader和appclassloader

    package kite jvm import java net URL 首先为什么 1 可以 因为OneURLClassLoader在加载Constant的时候发现需要加载 OneInterface 因为他是其接口 因为OneURLCla
  • merkle tree

    merkle tree 是用来存储hash值的一棵树 其叶子是数据块的hash值 非叶子节点是其对应子节点的串联字符串的hash hash是一个把任意长度数据映射成固定长度的函数 对于数据完整性校验 最简单的方法是对整个数据做Hash运算得
  • elasticsearch对数组进行搜索

    写在前面 我们在进行全文建搜的时候往往会添加很多前置条件 比如地区 时间 以及知识点树 我们需要在搜索之前先进行过滤在进行搜索 Array索引 es的数据类型中实际上是不包含数组类型的 在默认的情况下任何字段都可以包含0或者是更多的值 并且
  • docker配置nginx

    docker配置nginx 1 首先安装nginx镜像 docker pull nginx 安装好可以选择测试 也可以跳过 测试命令两行 docker run name nginx test p 80 80 d nginx docker s
  • OC 6702升压型恒流驱动芯片, ESOP8 封装,内置 100V 功率 MOS

    概述 OC 6702 是一款内置 100V 功率 NMOS 高效率 高精度的升压型大功率 LED 恒流驱动芯片 OC6702 采用固定关断时间的控制方 式 关断时间可通过外部电容进行调节 工作频率可根据用户要求而改变 OC6702 通过调节
  • 判断一个对象是否有空的属性值

    直接上代码 const trim str gt const newStr str 0 str str toString return newStr newStr replace s s g str 判断一个对象是否有空的属性值 const
  • 树莓派配置wifi做热点方法

    http wiki jikexueyuan com project raspberry pi wifi html
  • Java JDK8 Stream 使用详解

    Stream 流 的 筛选 去重 截取跳过映射 合并多个流 匹配 归约 简单示例 1 什么是流 2 流的特点 3 流的操作种类 4 流的操作过程 5 使用流 1 什么是流 流是Java8引入的全新概念 它用来处理集合中的数据 暂且可以把它理
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s

    背景 想导入一个别人的项目 却发现使用navicat运行数据库批次文件时出现了错误 爆出了这样的错误 Err 1064 You have an error in your SQL syntax check the manual that c
  • uniapp的tab切换自定义组件封装

    一 创建组件 在存放组件的文件夹新建一个 vue文件 二 使用子组件
  • 并不是所有的程序员都适合做技术管理

    CSDN记者 张勇 写在之前 在CSDN博客闲逛时无意间进入一个博客 博客地址 博客里的文章质量很高 文章话题主要涉及程序员素养和管理 文章有翻译也有原创 看了几篇文章之后 突然很想和这篇博名为 呦呦鹿鸣 签名则引用孟子 穷则独善其身 达则
  • js 字符串与二维数组间的转化

    1 字符串转二维数组 var a 1 2 3 4 5 a b c d e y1 y2 y3 y4 y5 var str eval a alert str 0 3 结果 4 2 二维数组转字符串 var b 1 2 a b function
  • 云原生之使用Docker部署Dashdot服务器仪表盘

    云原生之使用Docker部署Dashdot服务器仪表盘 一 Dashdot介绍 二 检查本地系统环境 1 检查本地系统版本 2 检查docker状态 3 检查docker版本 三 下载Dashdot镜像 四 部署Dashdot应用 1 创建
  • oracle存储过程----存储过程执行简单的增删改查sql

    存储过程执行简单的增删改查sql 上一篇文章 oracle存储过程 变量的介绍及使用 PL SQL 下边是一个简单的数据库表 为了方便 我都定义成了varchar 类型 1 存储过程执行增加sql 首先写一个增加的存储过程 create o
  • MQTT学习笔记——MQTT协议使用

    http mosquitto org files source mosquitto 1 4 5 tar gz 安装出错时openssl等 需要更改 cd mosquitto 1 4vi config mk可以选择去掉SSL的功能 可以参考h
  • ES相关随手记

    ES相关随手记 一 基本操作 1 es三大属性 索引 映射 文档 1 1 索引 查看 es 中所有的索引信息 GET cat indices v 创建 索引 PUT products 创建 索引 指定库信息 PUT products set
  • 记一次关于MySQL分页查询的优化方案(聚集索引与非聚集索引)

    最近在工作中 有一段逻辑需要从一张大约70W数据的表中分页查询 最开始写的SQL是 SELECT FROM table name WHERE 1 1 ORDER BY time column DESC LIMIT 600000 10 查询时
  • 编译QT5.12.12版本WebEngine模块支持H264视频播放

    qt自带的QtWebEngine模块无法播放HTML5中的mp3 mp4 需要重新编译 提供编译好的下载 环境 QT5 12 12 VS2017 Python2 一 在64位windows系统下编译32位MSVC选择VS2017如下命令 右
  • Redis的五大数据类型(一)

    1 字符串类型 string 1 添加 查询 添加数据 set key value 如果key已存在 之前的value将会被覆盖 查询指定key的值 get key 127 0 0 1 6379 gt set name zhangsan O