设为首页 收藏本站
查看: 1749|回复: 0

[经验分享] Redis实战(3)数据类型一Strings-Coder

[复制链接]

尚未签到

发表于 2018-11-7 09:34:57 | 显示全部楼层 |阅读模式
  Redis 的作者 antirez(Salvatore Sanfilippo)曾经发表了一篇名为 Redis 宣言(Redis Manifesto)
  的文章,文中列举了 Redis 的七个原则,以向大家阐明 Redis 的思想。
  1、Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。
  在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身
  及这些操作的时间空间复杂度。
  2、Redis 定位于一个内存数据库,正是由于内存的快速访问特性,才使得 Redis 能够有如此
  高的性能,才使得 Redis 能够轻松处理大量复杂的数据结构,Redis 会尝试其它的存储方面
  的选择,但是永远不会改变它是一个内存数据库的角色。
  3、Redis 使用基础的 API 操作基础的数据结构,Redis 的 API 与数据结构一样,都是一些最基
  础的元素,你几乎可以将任何信息交互使用此 API 格式表示。作者调侃说,如果有其它非人
  类的智能生物存在,他们也能理解 Redis 的 API。因为它是如此的基础。
  4、Redis 有着诗一般优美的代码,经常有一些不太了解 Redis 有的人会建议 Redis 采用一些
  其它人的代码,以实现一些 Redis 未实现的功能,但这对我们来说就像是非要给《红楼梦》
  接上后四十回一样。
  5、Redis 始终避免复杂化,我们认为设计一个系统的本质,就是与复杂化作战。我们不会为了一个小功能而往源码里添加上千行代码,解决复杂问题的方法就是让复杂问题永远不要提复杂的问题。
  6、Redis 支持两个层成的 API,第一个层面包含部分操作 API,但它支持用于分布式环境下
  的 Redis。第二个层面的 API 支持更复杂的 multi-key 操作。它们各有所长,但是我们不会推
  出两者都支持的 API,但我们希望能够提供实例间数据迁移的命令,并执行 multi-key 操作。
  7、我们以优化代码为乐,我们相信编码是一件辛苦的工作,唯一对得起这辛苦的就是去享
  受它。如果我们在编码中失去了乐趣,那最好的解决办法就是停下来。我们决不会选择让Redis 不好玩的开发模式。
  Redis 的作者 antirez 曾笑称 Redis 为一个数据结构服务器(data structures server)
  ,这是一个非常准确的表述,Redis 的所有功能就是将数据以其固有的几种结构来保存,并提供
  给用户操作这几种结构的接口。本文将介绍 Redis 支持的各种数据类型及其操作接口。
  strings 类型及操作
  string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个
  value,其上支持的操作与 Memcached 的操作类似。但它的功能更丰富。
  string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如 jpg 图片或者序
  列化的对象。从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节,下面是
  string 类型的定义:
struct sdshdr {  
long len;
  
long free;
  
char buf[];
  
};
  len 是 buf 数组的长度。
  free 是数组中剩余可用字节数,由此可以理解为什么 string 类型是二进制安全的了,因为它
  本质上就是个 byte 数组,当然可以包含任何数据了
  buf 是个 char 数组用于存贮实际的字符串内容,其实 char 和 c#中的 byte 是等价的,都是一
  个字节。
  另外 string 类型可以被部分命令按 int 处理.比如 incr 等命令,如果只用 string 类型,redis 就
  可以被看作加上持久化特性的 memcached。
  当然 redis 对 string 类型的操作比 memcached 还是多很多的,具体操作方法如下:
  set:
  设置 key 对应的值为 string 类型的 value。
  例如我们添加一个 name= HongWan 的键值对,可以这样做:
DSC0000.png

  setnx:
  设置 key 对应的值为 string 类型的 value。
  如果 key 已经存在,返回 0, nx是 not exist 的意思。
  例如我们添加一个 name= HongWan_new 的键值对,可以这样做:
DSC0001.png

  setex:
  设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。
  例如我们添加一个 haircolor= red 的键值对,并指定它的有效期是 10 秒,可以这样做:
DSC0002.png

  可见由于最后一次的调用是 10 秒以后了,所以取不到 haicolor 这个键对应的值。
  setrange:
  设置指定 key 的 value 值的子字符串。
  例如我们希望将 HongWan 的 126 邮箱替换为 gmail 邮箱,那么我们可以这样做:
DSC0003.png

  其中的 5 是指从下标为 5(包含 5)的字符开始替换
  mset:
  一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
DSC0004.png

  msetnx:
  一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值
  被设置,但是不会覆盖已经存在的 key。
DSC0005.png

  可以看出如果这条命令返回 0,那么里面操作都会回滚,都不会被执行。
  get:
  获取 key 对应的 string 值,如果 key 不存在返回 nil。
  getset:
  设置 key 的值,并返回 key 的旧值。
DSC0006.png

  可见,如果 key 不存在,设置成功,但是将返回 nil
  getrange:
  获取指定 key 的 value 值的子字符串。
DSC0007.png

  字符串左面下标是从 0 开始的
  字符串右面下标是从-1 开始的
  当下标超出字符串长度时,将默认为是同方向的最大下标
  mget:
  一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
DSC0008.png

  incr:
  对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一
  个不存在的 key,则设置 key 为 1
DSC0009.png

  incrby:
  同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0
DSC00010.png

  decr:
  对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1
DSC00011.png

  decrby:
  减指定值
  decrby 完全是为了可读性,我们完全可以通过 incrby 一个负值来实现同样效果,反之一样。
DSC00012.png

  append:
  给指定 key 的字符串值追加 value,返回新字符串值的长度。
  例如我们向 name 的值追加一个@126.com 字符串,那么可以这样做:
DSC00013.png

  strlen:
  取指定 key 的 value 值的长度。
DSC00014.png




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-631799-1-1.html 上篇帖子: Redis实战(2)安装和试用 下篇帖子: Redis实战(4)数据类型二Hashes-Coder
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表