Redis新手向

相关资料

Redis官网

An introduction to Redis data types and abstractions

在线Tutorial: Try Redis

下载与安装

Redis命令参考(中文)

官方手册command reference

前言

Redis: The name Redis means REmote DIctionary Server.
Redis是一个Key-Value的存储系统、一个data structures server。与传统的存储字符串key和字符串value的存储系统相比,Redis的value提供了丰富多彩的数据结构。包括:

  • Binary-safe strings
  • Lists:基于链表的按照插入顺序排序的字符串集合
  • Sets:无序、不重复的字符串集合
  • Sorted Sets:与字符串相似,但每一个字符串元素都赋予了一个浮点数的值,称为score。所有的元素按照 score 值排序,因此可以使用 ZRANGE 命令以index获取元素
  • Hashes:其 value 存储由键值对组成的映射。键值对都是字符串,类似于Ruby和Python中的hashes
  • Bit arrays(or simply bitmaps):通过特殊的指令来把字符串值当作bits数组结果,可以设置和清楚单个bits,计算所有bits为1的个数,查找第一个置1或置0的bit等等
  • HyperLogLogs:一个非常轻量级的计算不重复元素的个数的数据结构(笔者个人的看法)
  • Streams:见Introduction to Redis Streams

本文只对常见的Redis数据类型和命令做总结,更详尽的命令可以查看官方手册command reference

Redis Keys

Redis存储系统的顶层Key,注意与Redis数据类型中的Hash部分的key做区分。结合Hash运算和散列表的知识不难得知,这个Key用于运算Redis的value的存储位置。
关于Redis Keys的一些特性和规则:

  • 二进制安全,意味着你可以将二进制序列作为一个key,从字符串 “foo” 到JPEG文件都可以。空字符串也是一个有效的key
  • 从内存、带宽和效率的角度考虑,过长的key不是个好主意
  • 太短的key也不是个好主意。比如 “u1000flw” 的可读性明显低于 “user:1000:followers”。你应该在key的长度中寻找平衡
  • 最好固定一个key的模版。多个字段时合理利用: . -等字符来提高key的可读性。比如 “object-type:id"这种模式对应"user:1000” 。多单词字段时可以写为 “comment:1000:reply.to” 或者 “comment:1000:reply-to”
  • key的最大允许大小为512MB

修改和查询key space

有几个与具体类型无关的对key进行操作的命令。

SET && EXISTS && DEL && TYPE

/**
* EXISTS:returns 1 or 0 to signal if a given key exists or not in the database
* DEL:deletes a key and associated value, whatever the value is.
* 		returns 1 or 0 depending on whether the key was removed(it existed) or not(there was no such key with that name).
*/
127.0.0.1:6379> SET mykey hello
OK
127.0.0.1:6379> EXISTS mykey
(integer) 1
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> EXISTS mykey
(integer) 0
/**
* TYPE: returns the kind of value stored at the specified key.
*/
127.0.0.1:6379> SET mykey x
OK
127.0.0.1:6379> TYPE mykey
string
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> TYPE mykey
none

更多与key space相关的指令参考command reference

Redis expires:keys with limited time to live

在介绍更复杂的数据结构之前,有必要介绍一下另一个与具体类型无关的指令,Redis expires。你可以通过expire指令来给key设定一个寿命,在寿命倒数完毕后相应的key将被销毁,就像执行了DEL指令一样。

  • 寿命能以秒和毫秒做单位
  • 到期时间分辨率总是1毫秒
  • 有关过期的信息被复制并保留在磁盘上,当您的Redis服务器停止时,时间实际上已经过去了(这意味着Redis保存key到期的时间)[参考资料硬翻译,本句笔者并没有理解,有知道的欢迎评论区指出]

EXPIRE && TTL && PERSIST

/**
* EXPIRE: set a timeout for a key, which is a limited time to live.
*/
127.0.0.1:6379> SET key somevalue
OK
127.0.0.1:6379> EXPIRE key 10 /* 10秒后key将被销毁 */
(integer) 1
127.0.0.1:6379> GET key /* 立即执行GET,还能获取到值 */
"somevalue"
127.0.0.1:6379> GET key /* 10秒之后GET,返回nil,nil有(无、不存在的)之意 */
(nil)

/**
* TTL: Time To Live. Check the remaining time for the key.
* 		当key不存在时,返回-2;
* 		当key存在但没有设置生存时间时,返回-1;
* 		否则,以秒为单位,返回key的剩余生存时间
*/
127.0.0.1:6379> SET key somevalue ex 10 /* create keys with expires using SET options */
OK
127.0.0.1:6379> TTL key
(integer) 5
127.0.0.1:6379> TTL key
(integer) 1
127.0.0.1:6379> TTL key
(integer) -2

/**
* PERSIST: remove the expire and make the key persist forever
*/
127.0.0.1:6379> SET key somevalue ex 20
OK
127.0.0.1:6379> TTL key
(integer) 18
127.0.0.1:6379> PERSIST key
(integer) 1
127.0.0.1:6379> TTL key
(integer) -1

Redis Strings

SET && GET

Redis Key所能对应的最简单的value。初学者最先接触的Redis数据类型。这种情况下,我们是把string类型的key映射到string类型的value。string类型有多种用法,比如可以用来缓存HTML网页。
说明:本文档所有redis命令通过redis-cli工具展示。127.0.0.1是本机ip,6379是redis-server的默认端口。markdown文档内代码块使用的js风格。所以部分代码高亮可能并不合适。

127.0.0.1:6379> SET mykey somevalue
OK
127.0.0.1:6379> GET mykey
"somevalue"

使用SETGET命令可以存取string value。SET其实是赋值操作,意味着如果对应的key已经有了value,那么后续针对该key的SET操作将覆盖原先的值。

value可以是string(包括binary data)的各种形式,你甚至可以把jpeg image当作一个value,但是一个value的大小不能超过512MB。

SET命令可以添加附加参数,比如我可以让key只在没有值的时候才赋值成功,我可以使用以下命令:

/**
* NX -- Only set the key if it does not already exist. 
* XX -- Only set the key if it already exist. 
*/
127.0.0.1:6379> SET mykey somevalue
OK
127.0.0.1:6379> SET mykey newval NX /* 只在key没有初始值的时候赋值 */
(nil)
127.0.0.1:6379> GET mykey
"somevalue"
127.0.0.1:6379> SET mykey newval XX /* 只在key有初始值的时候赋值 */
OK
127.0.0.1:6379> GET mykey
"newval"

number型表现形式的string在redis中可以直接进行原子性的增减操作,比如:

127.0.0.1:6379> INCR num
(integer) 101
127.0.0.1:6379> INCR num
(integer) 102
127.0.0.1:6379> INCRBY num 50
(integer) 152

INCR命令把string value转化成integer,加一,然后把新值赋值给value。与之类似的指令还有INCRBY、DECR和DECRBY。

原子性意味着什么呢?当多个客户端同时读取同一个string value时,进行加减操作,结果永远不会并发出错。比如客户端1读取“10”,客户端2读取“10”,客户端1+1,客户端2加1,结果永远是“12”。

Redis的所有操作都是原子性的,意思就是要么成功执行,要么失败完全不执行。单个操作是原子性的,多个操作也支持事务进行原子性包装,通过MULTI和EXEC指令包起来。

Redis支持单挑指令进行多个SET和GET操作,此种做法有助于减少延迟。

127.0.0.1:6379> MSET a 10 b 20 c 30
OK
127.0.0.1<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值