Redis学习笔记(2) Redis基础类型及命令之一

1. 基础命令

  (1) 获取符合规则的键名列表

  格式为:KEYS pattern

  其中pattern表示支持通配符

# 建立一个名为bar的键
127.0.0.1:6379> SET bar 1
OK
# 获取Redis所有键
127.0.0.1:6379> KEYS *
1) "bar"

  注意:KEYS命令需要遍历Redis中所有键,因此当键的数量较多时会影响性能。

  (2) 判断一个键是否存在

  格式为:EXISTS key

  如果存在则返回1,否则返回0.

127.0.0.1:6379> EXISTS bar
(integer) 1
127.0.0.1:6379> EXISTS noexists
(integer) 0

  (3) 删除键

  格式为:DEL key (key ...)

  可以删除一个或多个键,返回值是删除键的个数。

127.0.0.1:6379> DEL bar
(integer) 1
127.0.0.1:6379> DEL bar
(integer) 0

  DEL不支持通配符,可结合管道符和xargs命令实现删除符合规则的键。如删除一"user:"开头的键:

  redis-cli KEYS "user:*" | xargs redis-cli DEL,或

  redis-cli DEL ‘redis-cli KEYS "user:*"‘(测试未通过,o(╯□╰)o)

  (4) 获得键值的数据类型

  格式为:TYPE key

  返回的值可能是字符串类型string,散列类型hash,列表类型list,集合类型set及有序集合类型zset。

127.0.0.1:6379> SET foo 1
OK
127.0.0.1:6379> TYPE foo
string
127.0.0.1:6379> LPUSH bar 1
(integer) 1
127.0.0.1:6379> TYPE bar
list

2. 数据类型

  (1) 字符串类型

  字符串类型可以存储用户邮箱、JSON化的对象甚至是一张图片,一个字符串键存储的数据的最大容量是512MB。字符串是其他4中数据类型的基础。

  1) 命令

  ① 赋值和取值

  格式为:SET key value    GET key

  ② 递增数字

  格式为:INCR key

  作用是让当前键值递增,并返回递增后的值。

127.0.0.1:6379> INCR num
(integer) 1
127.0.0.1:6379> INCR num
(integer) 2

  ③ 增加指定的整数

  格式为:INCRBY key increment

  ④ 减少指定的整数

  格式为:DECR key 或 DECRBY key value

  ⑤ 增加指定浮点数

  格式为:INCRBYFLOAT key increment

  INCRBYFLOAT 与INCRBY类似,差别是前者可以递增一个双精度浮点数

127.0.0.1:6379> INCRBYFLOAT bar 2.7
"2.7"
127.0.0.1:6379> INCRBYFLOAT bar 5E+4
"50002.69999999999999929"

  ⑥ 向尾部追加值

  格式为:APPEND key value

  键不存在则将该键的值设为value,返回值是追加后字符串的总长度。

127.0.0.1:6379> SET key hello
OK
127.0.0.1:6379> APPEND key " world!"
(integer) 12

  ⑦ 获取字符串长度

  格式为:STRLEN key

  STRLEN命令返回键值的长度,不存在则为0.

127.0.0.1:6379> STRLEN key
(integer) 12
127.0.0.1:6379> SET key 你好
OK
127.0.0.1:6379> STRLEN key
(integer) 4
# UTF-8编码的中文长度为2

  ⑧ 同时获得/设置多个键值

  格式为:MGET key {key ...}     MSET key value [key value...]

127.0.0.1:6379> MSET key1 v1 key2 v2 key3 v3
OK
127.0.0.1:6379> GET key2
"v2"
127.0.0.1:6379> MGET key1 key3
1) "v1"
2) "v3"

  ⑨ 位操作

  格式为:GETBIT key offset    SETBIT key offset value

      BITCOUNT key [start] [end]  BITOP operation destkey key [key ...]

  GETBIT命令可以获得一个字符串类型键在指定位置的二进制位的值,索引从0开始;

  SETBIT可以设置字符串类型指定位置的二进制位的值,返回值是该位置的旧值。

  BITCOUNT可以获得字符串类型中值是1的二进制位个数。通过参数限制统计的字节范围:BITCOUNT foo 0 1。

  BITOP命令可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键中。支持的运算符有AND,OR,XOR及NOT。

127.0.0.1:6379> SET foo1 bar
OK
127.0.0.1:6379> SET foo2 aar
OK
127.0.0.1:6379> BITOP OR res foo1 foo2
(integer) 3
127.0.0.1:6379> GET res
"car"  

  2) 示例

  博客常见功能是统计文章的访问量,可以为文章设置键post:文章 ID:page.view来记录文章的访问量,每次访问时使用INCR使相应的键值递增。Redis命名一般采用"对象类型:对象ID:对象属性"格式,当出现多个单词时则使用"."。

  Redis自增ID的生成:对于每一类对象使用名为对象类型(复数形式):count的键(如users:count)来存储当前类型对象的数量,每增加一个新对象时都使用INCR递增该键的值。INCR返回的值既是加入该对象后的当前类型的对象总数,又是该新增对象的ID。

  每个字符串类型键只能存储一个字符串,而一篇文章由标题、正文、作者等多个元素构成,此时需要通过序列化(如JSON)将其转换为字符串。因此发布新文章时与Redis操作相关的伪代码如下:

# 首先获取新文章的ID
$postID = INCR posts:count
# 将文章的多元素序列化成字符串(PHP)
$serializedPost = serialize($title, $content, $author, $time)
# 把序列化后的字符串存入一个字符串类型的键中
SET post:$postID:data, $serializedPort

  获取文章数据的伪代码:

# 从Redis中读取文章数据(以ID为42的文章为例)
$serializedPost = GET post:42:data
# 将文章数据反序列化成文章的各个元素
$titlt, $content,$author, $time = unserialize($serializedPost)
# 获取并递增文章的访问数量
#count = INCR post:42:page.view

  (2) 散列类型

  散列类型存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型(集合类型不能嵌套)。散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。

  1) 命令

  ① 赋值与取值

  其格式为:HSET key field value  HGET key field  HMSET key filed value [field value...]  

       HMGET key field [field...]  HGETALL key

  例:

127.0.0.1:6379> HSET car price 500
(integer) 1
127.0.0.1:6379> HSET car name BMW
(integer) 1
127.0.0.1:6379> HGET car name
"BMW"

  注意,HSET命令不区分插入和更新操作。当执行的是插入操作时,HSET命令返回1,当执行的是更新操作时,HSET命令返回0.Redis中每个键都属于一个明确的数据类型。

  当需同时设置多个字段的值事,可以使用HMSET命令,如:

  HSET key field1 value1 与 HSET key field2 value2可改写为HMSET key field1 value1 field2 value2

  HMGET命令则可同时获得多个字段的值。HGETALL命令适用于获取键中所有字段和字段值却不知道键中有哪些字段的情况。

127.0.0.1:6379> HMGET car price name
1) "500"
2) "BMW"

#返回结果是字段和字段值组成的列表
127.0.0.1:6379> HGETALL car
1) "price"
2) "500"
3) "name"
4) "BMW"

  ② 判断字段是否存在

  格式为:HEXISTS key field,存在则返回1,否则返回0。

127.0.0.1:6379> HEXISTS car model
(integer) 0
127.0.0.1:6379> HSET car model c200
(integer) 1
127.0.0.1:6379> HEXISTS car model
(integer) 1

  ③ 当字段不存在时赋值

  格式为:HSETNX key field value,HSETNX与HSET命令的区别在于如果字段已存在,HSETNC不会执行任何操作。

  ④ 增加数字

  格式为:HINCRBY key field increment,散列类型没有HINCR命令,但可通过HINCRBY key field 1实现。

#HINCRBY命令会自动创建person键,且score在执行命令前值为9
127.0.0.1:6379> HINCRBY person score 60
(integer) 60

  ⑤ 删除命令

  格式为:HDEL key field [field ...],可以删除一个或多个字段,返回值为被删除的字段个数。

127.0.0.1:6379> HDEL car price name
(integer) 2
127.0.0.1:6379> HDEL car price
(integer) 0

  ⑥ 只获取字段名或字段值

  格式为:HKEYS key   HVALS ket

127.0.0.1:6379> HKEYS car
1) "model"
127.0.0.1:6379> HVALS car
1) "c200"

  ⑦ 获取字段数量

  格式为:HLEN key

127.0.0.1:6379> HLEN car
(integer) 1

  2) 示例

  在涉及到存储文章缩略名时,可使用一个散列类型的键slug.to.id来存户文件缩略名和ID之间的映射关系,其中字段用来记录缩略名,字段值用来记录缩略名对应的ID。发布文章的代码修改:

$postID = INCR posts:count

# 判断用户输入的slug是否可用,可用则记录
$isSlugAvaliable = HSETNX slug.to.id, $slug, $postID

if $isSlugAvailable is 0
    # slug已经用过,提示用户更换slug
    exit
HMSET post:$postID, title, $title, content, $content, slug, $slug...

  当用户访问文章时,从网址中得到缩略名,并查询slug.to.id键来获取文章ID:

$postID = HGET slug.to.id , $slug

if not $posyID
    print 文章不存在
    exit
$post = HGETALL post:$posyID
print 文章标题:$post.title

  需要注意:如果要修改文章的缩略图,一定不能忘了修改slug.to.id键对应的字段。

# 判断新的slug是否可用,可用则记录
$isSlugAvaliable = HSETNX slug.to.id, #newSlug, 42
if $isSlugAvaliable is 0
    exit

# 获取旧的缩略图
   $oldSlug = HGET post:42, slug

# 设置新的缩略名
HSET post:42, slug, $newSlug

# 删除旧的缩略名
HDEL slug.to.id $oldSlug

  (3) 列表类型

  列表类型可以存储一个有序的字符串列表(双向链表实现),常用的操作时向列表两端添加元素或获得列表的某一个片段。

  1) 命令

  ① 向列表两端增加元素

  格式为:LPUSH key value [value... ]  RPUSH key value [value...]

  LPUSH向列表左边增加元素,RPUSH向列表右边增加元素,返回值表示增加元素后列表的长度。

127.0.0.1:6379> LPUSH numbers 1
(integer) 1
127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
 RPUSH numbers 0 -1
(integer) 5

  ② 从列表两端弹出元素

  格式为:LPOP key    RPOP key

  LPOP执行两步操作:第一步是将列表左端的元素从列表中移除,第二步是返回被移除的元素值。

127.0.0.1:6379> LPOP numbers
"3"
127.0.0.1:6379> RPOP numbers
"-1"

  如果想把列表当做栈,则搭配使用LPUSH和LPOP或RPUSH和RPOP,如果相当成队列,则搭配使用LPUSH和RPOP或RPUSH和LPOP。

  ③ 获取列表元素个数

  格式为:LLEN key

127.0.0.1:6379> LLEN numbers
(integer) 3

  ④ 获取列表片段 

  格式为:LRANGE key start end,返回索引从start和stop之间的所有元素(包含两端的元素),起始索引为0

127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"

  LRANGE也支持负索引,表示从右边开始计算序数,-1指最右边第一个元素,-2指最右边第二个元素。因此,LRANGE numbers 0 -1可以获取列表中所有元素。

  此外,如果start的索引位置比stop的索引位置靠后,则会返回空列表;如果stop大于实际的索引范围,则会返回列表最右边的元素:

127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
127.0.0.1:6379> LRANGE numbers 1 999
1) "1"
2) "0"

  ⑤ 删除列表中指定的值

  格式为:LREM key count value,LREM会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。

  当count>0时LREM会从列表左端开始删除前count个值为value的元素;当count<0时LREM会从列表右边开始删除前|count|个值为value的元素;当count=0时LREM会删除所有值为value的元素。

127.0.0.1:6379> RPUSH numbers 2
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "2"

#从右边开始删除第一个值为"2"的元素
127.0.0.1:6379> LREM numbers -1 2
(integer) 1

127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"

  ⑥ 获得/设置指定索引的元素值

  格式为:LINDEX key index    LSET key index value

# 列表当做数组来用,LINDEX必不可少,LINDEX用于返回指定索引的元素,从0开始
127.0.0.1:6379> LINDEX numbers 0
"2"

# index为负数表示从右边开始计算的索引
127.0.0.1:6379> LINDEX numbers -1
"0"

# LSET会将索引为index的元素赋给value
127.0.0.1:6379> LSET numbers 1 7
OK
127.0.0.1:6379> LINDEX numbers 1
"7"

  ⑦ 只保留列表指定片段

  格式为:LTRIM key start end

  该命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法同LRANGE。

127.0.0.1:6379> LRANGE numbers 0 1
1) "2"
2) "7"

127.0.0.1:6379> LTRIM numbers 1 2
OK

127.0.0.1:6379> LRANGE numbers 0 1
1) "7"
2) "0"

  LTRIM命令和LPUSH命令一起使用来限制列表中的元素的数量,如记录日志时希望保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可:LPUSH logs $newLog  LTRIM logs 0 99

  ⑧ 向列表中插入元素

  格式为:LINSERT key BEFORE|AFTER pivot value

  该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。LINSERT返回值是插入后列表的元素个数。

127.0.0.1:6379> lrange numbers 0 -1
1) "2"
2) "7"
3) "0"

127.0.0.1:6379> LINSERT numbers AFTER 7 3
(integer) 4

127.0.0.1:6379> LINSERT numbers BEFORE 2 1
(integer) 5

127.0.0.1:6379> LRANGE numbers 0 91
1) "1"
2) "2"
3) "7"
4) "

  ⑨ 将元素从一个列表转到另一个列表

  格式为:RPOPLPUSH source destination

  先执行RPOP命令,再执行LPUSH命令,即先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值。伪代码如下:

def rpoplpush ($source, $destination)
    $value = RPOP $source
    LPUSH $destination, $value
    return $value

  当把列表类型作为队列使用时,RPOPLPUSH可以很直观地在多个队列中传递数据。当source和destination相同时,RPOPLPUSH不断将队尾的元素移到队首。(该特性可以实现网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断的使用RPOPLPUSH循环取出一个网址来测试可用性,且在程序执行过程中仍然可以不断向网址列表中加入新网址,整个系统容易扩展,并允许多个客户端同时处理队列)。  

  2) 示例:

  使用列表类型键posts:list记录文章ID列表,当发布新文章时使用LPUSH命令把新文章ID加入该列表中,此外,删除文章时也要记得把列表中的文章ID删除。

  有了文章ID列表,可使用LRANGE命令实现文章的分页显示:

$postsPerPage=10
#start=($currentPage-1)*$postsPerPage
#end=$currentPage*$postsPerPage-1
$postsID=LRANGE    posts:list, $start, $end

#获得此页需要显示的文章列表,接通过循环读取文章
for each $id in $postsID
    $post=HGETALL post:$id
    print 文章标题:$post.title

  这样显示的文章列表是根据加入列表的顺序倒序的。

  列表类新存储文章的评论,适合将一条评论的各个元素序列化成字符串后作为列表类型键中的元素来存储。下面使用列表类型键post:文章ID:comments来存储某个文章的所有评论:

# 将评论序列化成字符串
$serializedComment=serialize($author, $mail, $time, $content)
LPUSH post:42:comments, $serializedComment

  

时间: 2024-10-09 23:27:40

Redis学习笔记(2) Redis基础类型及命令之一的相关文章

Redis学习笔记(三) Redis API与常用数据类型简介

一.Redis中常用数据类型 由上一篇博客可知,Redis目前提供五种数据类型:string(字符串).list(链表).Hash(哈希).set(集合)及zset(sorted set)  (有序集合).现在,我们一一来看看这五种数据类型的基本使用方法.在开始介绍之前,我们先使用刚刚引入的Redis API建立一个Redis客户端对象,有了这个客户端对象,我们才能和Redis服务端进行通信,且看下面的一行代码.我们需要事先指定好Redis服务端的IP地址和端口号,然后根据这两个信息建立一个Re

Redis学习笔记(4) Redis事务、生存时间及排序

1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令. 127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd user:1:following 2 QUEUED 127.0.0.1:6379> sadd user:2:followers 1 QUEUED 127.0.0.1:6379>

Redis学习笔记(二)-key相关命令

Redis支持的各种数据类型包括string,list ,set ,sorted set 和hash . Redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符串类型,但是key中不能包括边界字符.由于key不是binary safe的字符串,所以像"my key"和"mykey\n"这样包含空格和换行的key是不允许的.顺便说一下在redis内部并不限制使用binary字符,这是redis协议限制的."\r\n&q

Redis学习笔记(3) Redis基础类型及命令之二

1. 集合类型 集合类型与列表类型有很多相似之处,但二者的区别在于:前者具有唯一性,但不具有有序性:后者具有有序性,但不具有唯一性.集合类型的常用操作是向集合中加入或删除元素.判断某个元素是否存在等,以及多个集合类型之间进行并集.交集和差集运算. (1) 命令 1) 增加/删除元素 格式为:SADD key member [member ...] SREM key member [member ...] SADD向集合中增加一个或多个元素,加入的元素若已存在语集合中,则会忽略该元素.命令返回成功

Redis学习笔记之入门基础知识——其他特性

1.订阅(subscribe)与发布(publish) 用户订阅某一个频道,频道发布新的信息时,会将信息告知用户 2.数据安全 1)     快照持久化(时间点转储,实质是数据副本) 操作:SAVA.BGSAVE(后台子进程SAVE) 功能:服务器会保存最近一次完成创建的快照的数据,注意,在创建快照的过程中的操作不会保存在快照中 SAVE seconds times:从上一次快照创建完成到seconds秒的时间内,如果有times次写入,那么会在seconds秒后执行一次BGSAVE,将数据写入

Redis学习笔记3-Redis5个可运行程序命令的使用

在redis安装文章中,说到安装好redis后,在/usr/local/bin下有5个关于redis的可运行程序.以下关于这5个可运行程序命令的具体说明. redis-server Redisserver的daemon启动程序 #启动并加装指定配置文件 redis-server redis.conf #查redis服务版本 redis-server –version # 以标准输入作为配置启动redis,当中key为配置參数,value为配置參数值 redis-server --port 600

Redis学习笔记~StackExchange.Redis实现分布式Session

回到目录 对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现,即session存储的问题,如一个用户登陆后,把一个状态信息存储到当前WEB服务器的session里,而你请求其它页面时,很可能就被路由到另一台服务器了,这时,session也就丢了,而对于这种情况,有人把redis这个存储中间件想了起来,对它进行了封装,就有了今天基于redis的session共

Redis学习笔记4-Redis配置具体解释

在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redis学习笔记中Redis的依照方式依照后,Redis的配置文件是/etc/redis/6379.conf.以下是Redis2.8.9的配置文件各项的中文解释. #daemonize no 默认情况下, redis 不是在后台运行的.假设须要在后台运行,把该项的值更改为 yes daemonize ye

Redis学习笔记~目录

redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都 支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排 序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更