欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Redis研究(三)—字符串类型

程序员文章站 2022-03-24 22:25:58
...

在介绍Redis字符串类型之前,先来了解几个比较基础的命令作为热身。 1.获得符合规则的键名列表 keys pattern pattern支持glob风格通配符格式,具体规则如下: ? 匹配一个字符 * 匹配任意个(包括0个)字符 [] 匹配括号间的任一字符,可以使用-符号表示一个

在介绍Redis字符串类型之前,先来了解几个比较基础的命令作为热身。

1.获得符合规则的键名列表

keys pattern
pattern支持glob风格通配符格式,具体规则如下:
匹配一个字符
* 匹配任意个(包括0个)字符
[] 匹配括号间的任一字符,可以使用“-”符号表示一个范围,如a[b-d]可以匹配“ab”,“ac”,“ad”
\x 匹配字符x,用于转义符号。如要匹配“?”就需要使用\?

Redis不区分命令大小写。





2.判断一个键是否存在

exists key
存在返回1,不存在返回0

Redis研究(三)—字符串类型

3.删除键

del key [key ...]
可以删除一个或者多个键,返回值是删除的键的个数。

Redis研究(三)—字符串类型

del命令的参数不支持通配符,但我们可以结合linux的管道和xargs命令自己实现删除所有符合规则的键,

比如说要删除所有以“user:”开头的键,就可以执行

redis-cli keys "user:*" | xargs redis-cli del
另外,由于del命令支持多个键作为参数,所以还可以执行
redis-cli del 'redis-cli keys "user:*"'
来达到同样的效果,但是性能更好。

4.获得键值的数据类型

type key
返回值可能是string字符串,hash散列,list列表,set集合,zset有序集合
Redis研究(三)—字符串类型

字符串类型

1.介绍

最基本的数据类型,能存储任何形式的字符串,包括二进制数据。可以存储json对象,甚至一张图片,

一个字符串类型键允许存储的数据的最大容量是512mb,Redis3.0版本中可能会放宽这一限制。

2.命令

(1)赋值与取值

Redis研究(三)—字符串类型

当键不存在时会返回空结果。

(2)递增数字

当存储的键值时整数形式时,incr命令作用是让当前键递增,并返回递增后的值

当要操作的键不存在是默认起始值为0.,当键值不是整数类型是,Redis会提示错误。

Redis研究(三)—字符串类型

多个客户端同时连接到Redis时incr会可能出现竞态条件,因为incr在内的所有Redis命令都是原子操作

所以会出现当多个客户端同时改变一个值时,只会成功改变一次,不会累计增加。

3.实践

Redis对于键的命令规范: “对象类型:对象ID:对象属性”

eg:user:1:friends来存储ID为1的用户的好友列表。

下面就是一个列子:博客的访问量功能

#首先获得新文章的ID
$postID = incr posts:count
#将博客文章的诸多元素序列化成字符串
#序列化函数(如php的serialize和JavaScript的JSON.stringify)将他们转换成一个字符串,除此之外,因为字符串类型键可以存储二进制数据,所以也可以使用MessagePack进行序列化,速度更快,占用空间也更小
$serializedPost = serialize($title,$content,$author,$time)
#把序列化后的字符串存一个字符串类型的键中
$set post:$postID:data,$serializedPost

获取文章数据的伪代码如下(以访问ID为42的文章为列子):

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

4.命令拾遗

(1)增加指定的整数

incrby ket increment
Redis研究(三)—字符串类型

(2)减少指定的整数

decr key
decrby key decrement
Redis研究(三)—字符串类型

(3)增加指定浮点数

incrbyfloat key increment
Redis研究(三)—字符串类型

(4)向尾部追加值

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

Redis研究(三)—字符串类型

append命令的第二个参数加了双引号,原因是该参数包含空格。

(5)获取字符串长度

strlen key
Redis研究(三)—字符串类型

(6)同时获得/设置多个键值

mset key1 v1 key2 v2 key3 v3
get key2
mget key1 key2
(7)位操作
getbit key offset
setbit key offset value
bitcount key [start] [end]
bittop operation destkey key [key ...]
一个字节由8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。

Redis研究(三)—字符串类型

bar的3个字母对应的ASCII码分别为98,97,114.转换成二进制位结构图所示

Redis研究(三)—字符串类型

getbit命令可以获得一个字符串类型键指定位置的二进制位的值(0/1),索引从0开始。如超出实际长度则默认位置为0.

setbit命令可以设置指定位置的二进制位的值,返回值是该位置的旧值

Redis研究(三)—字符串类型

如果要设置的位置超过了键值的二进制位的长度,setbit命令会自动将中间的二进制位设置为0

Redis研究(三)—字符串类型

同理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0

Redis研究(三)—字符串类型

bitcount命令返回值是1的二进制位个数,也可以通过参数来限制统计的字节范围,只统计两个字节“aa”

Redis研究(三)—字符串类型

bitop命令可以对多个字符串键进行位运算,并将结果存储在destkey参数指定的键中。支持的运算操作有and,or,xor和not。对bar和aar进行or运算

Redis研究(三)—字符串类型

运算过程如下:

Redis研究(三)—字符串类型

getbit和setbit的时间复杂度都是O(1),所以读取二进制位值性能很高。