Redis实战(3)数据类型一Strings

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

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 类型的定义:

1
2
3
4
5
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 的键值对,可以这样做:

142437807.png

setnx:

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

setex:

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

可见由于最后一次的调用是 10 秒以后了,所以取不到 haicolor 这个键对应的值。


setrange:

设置指定 key 的 value 值的子字符串。
例如我们希望将 HongWan 的 126 邮箱替换为 gmail 邮箱,那么我们可以这样做:
143230475.png

其中的 5 是指从下标为 5(包含 5)的字符开始替换

mset:

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
143447382.png

msetnx:

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

可以看出如果这条命令返回 0,那么里面操作都会回滚,都不会被执行。
get:

获取 key 对应的 string 值,如果 key 不存在返回 nil。

getset:

设置 key 的值,并返回 key 的旧值。
144342608.png

可见,如果 key 不存在,设置成功,但是将返回 nil
getrange:

获取指定 key 的 value 值的子字符串。
145131305.png

字符串左面下标是从 0 开始的
字符串右面下标是从-1 开始的
当下标超出字符串长度时,将默认为是同方向的最大下标


mget:

一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
145311725.png

incr:

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

incrby:

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

decr:

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

153024621.png

decrby:

减指定值

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

append:

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


strlen:

取指定 key 的 value 值的长度。
154409527.png



























本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1336767,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
88 4
|
1月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
180 85
|
1月前
|
存储 NoSQL Redis
redis常见数据类型
Redis 是一种基于内存的键值存储数据库,支持字符串、哈希表、列表、集合及有序集合等多种数据类型,每种类型均有特定用途与适用场景,提供丰富的命令操作,适用于高速数据访问与处理。
56 5
|
2月前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
54 1
|
3月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
163 5
|
3月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
218 2
|
3月前
|
存储 消息中间件 NoSQL
Redis 数据类型
10月更文挑战第15天
57 1
|
4月前
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
4月前
|
存储 消息中间件 缓存
深入探析Redis常见数据类型及应用场景
深入探析Redis常见数据类型及应用场景
84 2
|
5月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。