redis 系列10 字符串对象
原文:redis 系列10 字符串对象

一. 字符串对象编码

  Redis中字符串可以存储3种类型,分别是字节串(byte string)、整数、浮点数在上章节中讲到字符串对象的编码可以是int, raw,embstr。 如果一个字符串对象保存的是整数值,那么对象RedisObject结构的ptr 属性里面将void*转换成long,字符串对象的编码设置为int。

  例1: 使用set命令,创建一个int编码的字符串对象。

    127.0.0.1:6379> set num1 10086OK127.0.0.1:6379> object encoding num1"int"

  RedisObject结构中ptr指向一个long值,参考图如下所示:

  例2: 使用set命令,创建一个raw编码的字符串对象。这个字符串值的长度大于32字节。

    127.0.0.1:6379> set story3 "long long long long long long long long long ..."OK127.0.0.1:6379> strlen story3(integer) 48127.0.0.1:6379> object encoding story3"raw"

    RedisObject结构中ptr指向SDS的sdshdr结构, 参考图如下所示:

  例3: 使用set命令,创建一个embstr编码的字符串对象, 这个字符串值的长度小于等于32字节。

    127.0.0.1:6379> set story4 "long long long long long lon"OK127.0.0.1:6379> strlen story4(integer) 28127.0.0.1:6379> object encoding story4"embstr"

    embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用RedisObject结构和sdshdr结构来表示字符串对象。使用embstr编码的字符串对象来保存短字符串值有以下好处: 

(1) embstr编码将创建字符串对象所需的内存分配次数从raw编码的两次降低为一次。

(2) 释放embstr编码的字符串对象只需要调用一次内存释放函数。而raw编码的为二次。

(3) embstr编码的字符串对象的所有数据都保存在一块连续的内存中,能更好的带来缓存优势。

  例4: 使用set命令,创建一个浮点数,也是作为字符串保存,属于embstr编码的字符串对象。

    127.0.0.1:6379> set pi 3.14OK127.0.0.1:6379> object encoding pi"embstr"

    最后:总结字符串对象保存各类型值的编码方式

字符串对象值 编码
可以用long类型保存的整数 int
可以用long double类型保存的浮点数 Embstr或者raw
值长度太长而没办法用long类型表示的整数,或者浮点数。 Embstr或者raw
值的长度大于32字节 raw
长度小于32字节 Embstr

二. key命令  

 -- del命令 删除存在的key, 如果没有存在的key返回0。127.0.0.1:6379> del msg(integer) 1-- dump命令 序列化给定 key, 如果 key 不存在, 那么返回 nil,否则返回序列化之后的值。127.0.0.1:6379> dump msg"\x00\x05hello\b\x00\xda_3\xc9\xcc-\xaa2"-- EXISTS命令 用于检查给定 key 是否存在, 若 key 存在返回 1 ,否则返回 0 。127.0.0.1:6379> exists msg(integer) 1-- Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。设置成功返回1。下面设置了过期时间为 1 分钟,1分钟后该键会自动删除。127.0.0.1:6379> expire msg 60(integer) 1
-- pattern 命令用于查找所有符合给定模式,返回符合给定模式的 key 列表 (Array)。127.0.0.1:6379> set msg1 1OK127.0.0.1:6379> set msg2 2OK127.0.0.1:6379> set msg3 3OK127.0.0.1:6379> keys msg*1) "msg2"2) "msg1"3) "msg3"
-- PERSIST 命令用于移除给定 key 的过期时间,使得 key 永不过期。
-- Pttl 命令以毫秒为单位返回 key 的剩余过期时间。
-- ttl  命令以秒为单位返回 key 的剩余过期时间。127.0.0.1:6379> expire msg1 60(integer) 1127.0.0.1:6379> ttl msg1(integer) 49127.0.0.1:6379> persist msg1(integer) 1127.0.0.1:6379> ttl msg1(integer) -1
-- RANDOMKEY 命令从当前数据库中随机返回一个 key127.0.0.1:6379> RANDOMKEY "fruit-price"
-- Rename 命令用于修改 key 的名称127.0.0.1:6379> rename msg1 msg1newOK-- Renamenx 命令修改 key名称,新的key没有存已有数据库中时,修改成功.返回1.127.0.0.1:6379> get msg2"2"127.0.0.1:6379> get msg3"3"127.0.0.1:6379> renamenx msg2 msg3(integer) 0127.0.0.1:6379> renamenx msg2 msg4(integer) 1 

其它:
  MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
  -- type 命令用于返回 key 所储存的值的类型
  none (key不存在),string (字符串),list (列表),set (集合),zset (有序集),hash (哈希表)

 

三.字符串对象命令

 --  set命令指定 key 的值--  get 命令获取指定 key 的值--  GETRANGE返回 key 中字符串值的子字符127.0.0.1:6379> set msg "hello"OK127.0.0.1:6379> getrange msg 0 2"hel"--  getset 命令将给定 key 的值重新设置 value ,并返回 key 的旧值(old value)127.0.0.1:6379> getset msg "hi""hello"127.0.0.1:6379> get msg"hi"--  MGET 命令获取所有(一个或多个)给定 key 的值127.0.0.1:6379> mget msg msg31) "hi"2) "3"-- setex 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)127.0.0.1:6379> setex message 10 "hello"OK127.0.0.1:6379> get message"hello"127.0.0.1:6379> get message(nil)   10秒后-- setnx命令 只有在 key 不存在时设置 key 的值, 下面msg键存在,设置失败返回0,msg1键不存在,设置成功,返回1127.0.0.1:6379> setnx msg "hello"(integer) 0127.0.0.1:6379> setnx msg1 "hello"(integer) 1-- setrange 命令用value参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。127.0.0.1:6379> set msg "hello"OK127.0.0.1:6379> setrange msg 1 "i..."(integer) 5127.0.0.1:6379> get msg"hi..."-- strlen 命令返回 key 所储存的字符串值的长度。127.0.0.1:6379> strlen msg(integer) 5-- mset 命令同时设置一个或多个 key-value 对。127.0.0.1:6379> mset msg "hi" msg2 "hi"OK127.0.0.1:6379> mget msg msg21) "hi"2) "hi"-- msetnx命令同时设置一个或多个 key-value 对,所有给定 key 都必须不存在, 只要存在一个已有的key,所有添加失败。127.0.0.1:6379> msetnx msg6 "hello" msg5 "hello"(integer) 1127.0.0.1:6379> mget msg6 msg51) "hello"2) "hello"-- psetex命令 它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。127.0.0.1:6379> psetex msg5 5000 "hi"OK127.0.0.1:6379> get msg5"hi"127.0.0.1:6379> get msg5(nil)  5秒后--  Incr 命令将 key 中储存的数字值增一。127.0.0.1:6379> set num  1OK127.0.0.1:6379> incr num(integer) 2127.0.0.1:6379> get num"2"-- Incrby 命令将 key 中储存的数字加上指定的增量值。在值为2是加10。127.0.0.1:6379> incrby num 10(integer) 12127.0.0.1:6379> get num"12"-- Decrby 命令将 key 所储存的值减去指定的减量值。将值为12 减去10。127.0.0.1:6379> decrby num 10(integer) 2127.0.0.1:6379> get num"2"--  Append 命令用于为指定的 key 追加值。127.0.0.1:6379> set msg "hello"OK127.0.0.1:6379> append msg "world"(integer) 10127.0.0.1:6379> get msg"helloworld"

posted on 2019-01-06 22:27 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10230741.html

redis 系列10 字符串对象相关推荐

  1. 「Redis数据结构」字符串对象(String)

    「Redis数据结构」字符串对象String 文章目录 「Redis数据结构」字符串对象String 一.概述 二.编码分类 int embstr row 三.小结 四.参考 一.概述 字符串数据类型 ...

  2. 大数据算法系列10:字符串检验算法

    文章目录 一. 字符串检验算法 二. 练习 2.1 面试题(输出字符串的排列组合) 2.2 POJ2262(求奇质素之和) 2.3 开门游戏 2.4 Uva106(费马大定律) 2.5 POJ3744 ...

  3. 【Redis系列2】Redis字符串对象之SDS(简单动态字符串)实现原理分析

    Redis字符串对象之SDS实现原理分析 前言 字符串对象 为什么Redis的字符串对象是二进制安全的 SDS空间分配策略 空间预分配 惰性空间释放 SDS和C语言字符串区别 SDS的底层存储对象 d ...

  4. 深入剖析Redis系列(五) - Redis数据结构之字符串

    前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...

  5. startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...

    引言 本文是对<redis设计与实现(第二版)>中数据结构与对象相关内容的整理与说明.本篇文章只对对象结构,1种对象--字符串对象.以及字符串对象所对应的两种编码--raw和embstr, ...

  6. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  7. Redis系列(三)--过期策略

    制定Redis过期策略,是整个Redis缓存策略的关键之一,因为内存来说,公司不可能无限大,所以就要对key进行一系列的管控. 文章结构: (1)理解Redis过期设置API(命令与Java描述版本) ...

  8. NoSql之Redis系列一: Redis的数据类型和基本使用

    NoSql之Redis系列一: Redis的数据类型和基本使用 Redis简介及特点 Redis常用数据结构及使用 启动redis-server (win) 使用redis-cli操作redis St ...

  9. 2020年11个Redis系列高频面试题,哪些你还不会?

    前言 现在大家的工作生活基本已经是回归正轨了,最近也是迎来了跳槽面试季,有些人已经拿到了一两个offer了. 这段时间收集了阿里.腾讯.百度.京东.美团.字节跳动等公司的Java面试题,总结了Redi ...

最新文章

  1. 【Python学习教程】推导式与生成器
  2. 《斗罗大陆》引入阿里云云原生数据库 PolarDB 游戏体验更流畅
  3. php寻找文本,PHP文本数据库的搜索方法_php
  4. asp.net core系列 48 Identity 身份模型自定义
  5. 01章.计算机网络概述(1.1~1.6)
  6. pfSense-2.4.4安装教程
  7. [面试] C/C++ 语法(六)—— RTTI(运行时类型信息)
  8. 【Redis学习笔记】Redis初识
  9. Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现
  10. (1)算法设计与分析_算法设计思路
  11. linux ubuntu软件中心,Ubuntu 20.04 将Ubuntu软件中心切换到Snap商店
  12. ps盖印图层在哪里_PS如何盖印图层?PS盖印图层快捷键
  13. Windows远程提示“终端服务器超出了最大允许连接”
  14. 论混合软件架构的设计
  15. SAP中报表清单导出的常用方法
  16. UGUI优化:使用镜像图片
  17. 单片机、ARM、MUC、DSP、FPGA、嵌入式
  18. 【电子杂志怎么制作】云展网教程 | 如何修改云展网杂志和书橱在微信显示的标题、小图标和描述?
  19. 模拟退火算法——解决售货员的难题
  20. linux屏幕触碰事件,touch事件中的touches、targetTouches和changedTouches详解

热门文章

  1. GestureDetector类及其用法
  2. wp7 --缓动动画
  3. eclipse 版本理解
  4. flex学习网站大全(转)
  5. Flutter 弧度与角度之间的换算
  6. Android动态显示和隐藏状态栏
  7. sublime Text3安装插件
  8. 静态long类型常量serialVersionUID的作用
  9. javascript的回调函数 同步 异步
  10. pl/sql developer 设置oracle的date类型默认显示样式