Redis学习笔记

一、redis说明

redis基础

二、redis类型

redis的数据类型有strings, hashes, lists, sets 和sorted sets 五种。

2.1 string类型及操作

  • set KEY VALUE
  • setnx KEY VALUE
  • setex KEY TIME(s) VALUE
  • setrange KEY POI STRING: 设置指定 key 的 value 值的子字符串
  • mset KEY1 VALUE1 KEY2 VALUE2 …: 一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值 被设置。
  • msetnx KEY1 VALUE1 KEY2 VALUE2 …: 一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值 被设置,但是不会覆盖已经存在的 key。
  • get KEY: 获取key对应的string值,如果key不存在返回nil。
  • getset KEY: 设置key的值,并返回key的旧值. 如果key不存在,那么将返回nil
  • getrange KEY POT_START POT_END: 获取指定 key 的 value 值的子字符串。
  • mget KEY1 KEY2 …: 一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
  • incr KEY: 对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一 个不存在的 key,则设置 key 为 1
  • incrby KEY NUM: 同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0
  • decr: 对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1
  • decrby: 同 decr,减指定值。
  • append: 给指定 key 的字符串值追加 value,返回新字符串值的长度。
  • strlen : 取指定 key 的 value 值的长度。

2.2 hashes类型及操作

Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1()平均)。 hash 特别适合用于存储对象。相较于将对象的每个字段存成单个 string 类型。将一个对象存 储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新 建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。这个 zipmap 其实并不 是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据 存储开销。尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field 数量都不 太多。所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)。如果 field 或者 value 的大小超出一定限制后,Redis 会在内部自动将 zipmap 替换成正常的 hash 实现. 这个限制可 以在配置文件中指定。

hash-max-zipmap-entries 64 #配置字段最多 64 个

hash-max-zipmap-value 512 #配置 value 最大为 512 字节

  • hset KEY FIELD VALUE : 设置 hash field 为指定值,如果 key 不存在,则先创建。
  • hsetnx KEY FIELD VALUE: 设置 hash field 为指定值,如果 key 不存在,则先创建。如果 field 已经存在,返回 0,nx 是 not exist 的意思。
  • hmset KEY FIELD1 VALUE1 FIELD2 VALUE2 …: 同时设置 hash 的多个 field.
  • hget KEY FIELD : 获取指定的 hash field。
  • hmget KEY FIELD1 FIELD2 … : 获取全部指定的 hash filed。
  • hincr KEY FIELD NUM: 指定的 hash filed 加上给定值。
  • hexists KEY FIELD: 测试指定 field 是否存在。
  • hlen KEY: 返回指定 hash 的 field 数量。
  • hdel KEY FIELD1 FIELD2 …: 删除指定 hash 的 field, 并返回删除field的数量。
  • hkeys KEY: 返回 hash 的所有 field。
  • hvals KEY: 返回 hash 的所有 value。
  • hgetall KEY: 获取某个 hash 中全部的 filed 及 value。

2.3 lists 类型及操作

list 是一个链表结构,主要功能是 pushpop、获取一个范围的所有值等等,操作中 key 理 解为链表的名字。

Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表。链表的最大长度是(2 的 32 次方)。我们可以通过 push,pop 操作从链表的头部或者尾部添加删除元素。这使得 list 既可以用作栈,也可以用作队列

有意思的是 list 的 pop 操作还有阻塞版本的,当我们[lr]pop 一个 list 对象时,如果 list 是空, 或者不存在,会立即返回 nil。但是阻塞版本的 b[lr]pop 可以则可以阻塞,当然可以加超时时 间,超时后也会返回 nil。为什么要阻塞版本的 pop 呢,主要是为了避免轮询。举个简单的 例子如果我们用 list 来实现一个工作队列。执行任务的 thread 可以调用阻塞版本的 pop 去获 取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回, 也可以避免轮询带来的延迟。

  • lpush KEY VALUE : 在 key 对应 list 的头部添加字符串元素
  • rpush KEY VALUE : 在 key 对应 list 的尾部添加字符串元素
  • linsert KEY before VALUE ADD_VALUE: 在 key 对应 list 的特定位置之前或之后添加字符串元素
  • lset KEY MAP VALUE : 设置 list 中指定下标的元素值(下标从 0 开始)
  • lrem KEY COUNT VALUE : 从 key 对应 list 中删除 count 个和 value 相同的元素。count>0 时,按从头到尾的顺序删除,count<0 时,按从尾到头的顺序删除,count=0 时,删除全部.
  • ltrim KEY COUNT_START COUNT_END : 保留指定 key 的值范围内的数据

  • lpop KEY : 从 list 的头部删除元素,并返回删除元素

  • rpop KEY : 从 list 的尾部删除元素,并返回删除元素
  • rpoplpush KEY1 KEY2: 从第一个 list 的尾部移除元素并添加到第二个 list 的头部,最后返回被移除的元素值,整个操 作是原子的.如果第一个 list 是空或者不存在返回 nil
  • lindex KEY MAP: 返回名称为 key 的 list 中 index 位置的元素
  • llen KEY : 返回 key 对应 list 的长度

2.4 sets 类型及操作

set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合
求交并差等操作,操作中 key 理解为集合的名字。

Redis 的 set 是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。

set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随 着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写 锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在 sorted set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的 取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns 中的好友推荐和 blog 的 tag 功能。

  • smembers KEY : 查看集合元素
  • sadd KEY VALUE :
    向名称为 key 的 set 中添加元素
  • srem KEY VALUE : 删除名称为 key 的 set 中的元素 member
  • spop KEY : 随机返回并删除名称为 key 的 set 中一个元素
  • sdiff KEY1 KEY2 : 返回所有给定 key 与第一个 key 的差集
  • sdiffstore KEY KEY1 KEY2 … : 返回所有给定 key 与第一个 key 的差集,并将结果存为另一个 key。注意是通过key1比对后面keyx得出的差值保存到KEY
  • sinter KEY1 KEY2 : 返回所有给定 key 的交集
  • sinterstore KEY KEY1 KEY2 … : 返回所有给定 key 的交集,并将结果存为另一个 key
  • sunion KEY1 KEY2 : 返回所有给定 key 的并集
  • sunionstore KEY KEY1 KEY2… : 返回所有给定 key 的并集,并将结果存为另一个 key
  • smove KEY1 KEY2 VALUE : 从第一个 key 对应的 set 中移除 member 并添加到第二个对应 set 中
  • scard KEY : 返回名称为 key 的 set 的元素个数
  • sismember KEY VALUE : 测试 member 是否是名称为 key 的 set 的元素
  • srandmember KEY : 随机返回名称为 key 的 set 的一个元素,但是不删除元素

2.5 sorted sets 类型及操作

sorted set 是 set 的一个升级版本,它在 set 的基础上增加了一个顺序属性,这一属性在添加 修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有 两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。

和 set 一样 sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double 类型的 score。sorted set 的实现是 skip list 和 hash table 的混合体。

当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个 元素获取 score 的开销是 O(1),另一个 score 到元素的映射被添加到 skip list,并按照 score 排 序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list 的 开销一致,redis 的 skip list 实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set 最 经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的 id 当元素存储。下面是 sorted set 相关命令

  • zadd KEY SCORE VALUE : 向名称为 key 的 zset 中添加元素 member,score 用于排序。如果该元素已经存在,则根据 score 更新该元素的顺序
  • zrange KEY SCORE_START SCORE_END [withscores] : 显示zset中指定的元素,当带上withscores参数时传排序值
  • zrem KEY VALUE : 删除名称为 key 的 zset 中的元素 member
  • zincrby KEY SCORE VALUE : 如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则 向集合中添加该元素,其 score 的值为 increment
  • zrank KEY VALUE : 返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序)即下标。
  • zrevrank KEY VALUE : 返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序)即下标
  • zrevrange KEY START END [withscores] : 返回名称为 key 的 zset(按 score 从大到小排序)中的 index 从 start 到 end 的所有元素
  • ? zrangebyscore KEY START END [withscores] : 返回集合中 score 在给定区间的元素 ?
  • zcount KEY START END : 返回集合中 score 在给定区间的数量。测试不能为负数。
  • zcard KEY : 返回集合中元素个数
  • zscore KEY VALUE : 返回给定元素对应的 score
  • zremrangebyrank KEY START END : 删除集合中排名在给定区间的元素
  • zremrangebyscore KEY START END : 删除集合中 score 在给定区间的元素

三、 redis常用命令

3.1 键值相关命令

  • keys : 返回满足给定 pattern 的所有 key
  • exists KEY : 确认一个 key 是否存在
  • del KEY : 删除一个 key
  • expire KEY TIME: 设置KEY的过期时间
  • move : 将当前数据库中的 key 转移到其它数据库中 ?
  • persist KEY : 移除给定 key 的过期时间
  • randomkey : 随机返回 key 空间的一个 key
  • rename KEY NEW_KEY : 重命名 key
  • type KEY : 返回值的类型

3.2 服务器相关命令

  • ping : 测试连接是否存活
  • echo VALUE : 在命令行打印一些内容
  • select ID : 选择数据库。Redis 数据库编号从 0~15,我们可以选择任意一个数据库来进行数据的存取。
  • quit : 退出连接。
  • dbsize : 返回当前数据库中 key 的数目。
  • info : 获取服务器的信息和统计。
  • monitor : 实时转储收到的请求。
  • config get VALUE : 获取服务器配置信息, 如 config get dir 获取redis的目录。
  • flushdb : 删除当前选择数据库中的所有 key。
  • flushadd : 删除所有数据库中的所有 key。

四、Redis高级使用特性

五、PHP中使用redis类

php安装redis扩展后即可使用,针对不同的php版本编译的扩展也是不一样的。

5.1 安装redis php 扩展

5.2 php常用redis方法

参考:https://github.com/ukko/phpredis-phpdoc

六、一些Redis相关工具