Redis 基本类型介绍与基础操作指令

这篇文章中的所有内容都是我看《Redis入门指南》中自己摘抄的笔记以及自己的理解,也是第一次接触 redis,所以很有可能下面给出的介绍不专业或者是错误的,还是自己亲手实践一下最安心。

首先先介绍以下 redis 可以存储哪些类型的数据,并且这些类型的数据的适用场景,以个人博客为例。

第一种类型--字符型

这个没什么好介绍的,只不过说一点我的个人发现,在 redis 中默认的存储方式就是字符,例如往其中添加一条数据 set key_name 1,之后使用类型判断命令 type key_name,结果就是显示 string 类型的,而且在其中存入字符类型时是不需要加双引号或者单引号的。 

字符基础操作命令:

清除全部数据
flusahall 

设置键值
set key value

同时设置多个值
mset key1 value1 key2 value2 key3 value3

得到键值
get key

同时得到多个值
mget key1 key2 key3

得到 value 的类型
type key

位操作,offset 就是位偏移量,以ASCII码为准
setbit key offset value
getbit key offset
bitcount key start end
bitop operation destkey key1 [key2] (operation:or and xor not,destkey 最后的结果,key1 和 key2 参与计算的值)

判断一个键值是否存在
exists key

删除键值
del key

筛选键值
keys pattern
pattern:
?	匹配任意一个字符
*	匹配任意数量字符
[]  匹配在 [] 中的任意一个字符
\	转义

数字类型:
当设置的 value 为整数时,增加1,不代表这个 value 的 type 是 int 类型,只是存储的内容是整数
incr key

类似于 incr,但是可以设置增加数量--increment
incrby key increment

同样可以减少 value 的值
decr key
decrby key decrement

上面都是整数,下面介绍别的数据类型
incrbyfloat key increment

修改 value的值,在尾部添加数据,将原数据与 value 连接在一起
append key value

获取字符串类型的 value 的长度
strlen key


第二种类型--散列类型

这个根据我个人理解有点像 json,但是不如 json 灵活,因为他不能嵌套,如一个散列类型里面不能嵌套其他类型,除了字符类型。想下面这张图一样的话比较好理解了。

相比较于 key value 的字符串类型,散列类型可以存储更过数据(这里的更多不是指物理实际上的,而是形式更加丰富),而且最重要的是可以就散列中的某个 field 进行筛选,虽然也是遍历全部 key,但是可以选择遍历 key 中的一部分,举个实际例子,一个博客系统,想设计一个根据文章名字进行筛选的系统,那么可以将文章拆分成以下形式:

这样下次遍历的时候只要遍历 key 下的 title,而不需要考虑很大篇幅的文章主体--text,有专门的指令,能根据 field 查找其中的内容。

散列类型基础操作指令:

(H hash)
设置值
hset key field value
hmset key field1 value1 field2 value2 field3 value3

当字段不存在时产生该字段,存在则不执行
hsetnx key field value (hsetnx== hash set not exists)

读取值
hget key field
hmget key field1 field2 field3
hgetall key 	(得到该 key 下的全部值,包括字段与值)

判断该字段是否存在
hexists key field

删除字段
hdel key field1 field2

如果 value 为整数的话
hincrby key field increment 

得到该 key 下全部 field
hkeys key

得到该 key 下全部 values
hvals key

获得该 key 下 fields 的数量
hlen key


第三种类型--列表类型:

结构上就是《数据结构》中的双链表,在表的头和尾能进行进出操作,而且还有一些别的参数来记录一些信息,这样在读取一些需要遍历整张表才能得出的数据可以很快得到,例如整张表的长度。但是这不是列表类型的亮点,他的亮点是对读写一定数量的接近两端的数据特别快,举个例子,博客上每篇文章都有一个专门的 id 变量,存储在上面的散列类型中,但是如果我现在想知道最新更新的100篇文章,这个时候就有问题了,解决思路应该是:id 肯定是自增的,所以先要读出最大的 id,这篇文章一定是最新更新的,但是接下来的99篇文章呢?散列类型没有像关系型数据库类型的 order 关键字,这个时候你只能将你现有的 id -1,验证这篇文章是否存在,因为很有可能这个 id-1 的文章已经被删除了,甚至接下来的 id-2,id-3 等,都要执行一次判断该 id 下这篇文章是否存在,这样无疑会有很多多余的操作。这个时候就是列表类型彰显优势的时候了,你可以直接从左和右读取任意数量的数据,假设我是这样设计数据存储的,文章统一从列表左边存入数据库的,那么意味着左边的第一个元素永远是最新的数据,最右边的是已经成为历史的数据,有专门的命令可以完成这样的操作,所以列表类型一般是用来存储对时效性要求比较高的数据,如新闻的头条。同时列表类型也存在缺点,那就是根据索引查询数据会很慢,比如我想查看热度排行榜第68的文章,这个时候的列表类型反应也是慢的,而且越接近列表中间段的数据,操作起来越耗时。

列表类型基础命令:

(L list)
从左边加入数据,删除数据
lpush key value
lpop key

从右边进行同样的操作 
(r remove)
rpush key value
rpop key

获取列表中长度 (有一个专门的内置变量来存储这个值,不是靠调用的时候遍历列表来得到这个值的)
llen key

获取列表片段
lrange key start stop (当 start,stop 为正数时表示从左边开始计算,为负数时表示从右边开始计数)

删除列表中指定的值 (lrem list remove)
lrem key count value 
当 count >0 表示从列表左侧开始删除最多 count 个值为 value 的元素
当 count <0 表示从列表右侧开始
当 count =0 表示全部删除值为 value 的元素

设置索引 (索引跟上面一样,正数表示从左边开始计算,负数表示从右边开始计算,结合数组理解吧)
lset key index value

获取索引下的 value
lindex key index

只保留列表指定片段,注意是只保留 start end 之间,其余删除,不要弄反了 (跟上面一样的正负号意义)
ltrim key start end

想列表中插入元素
linsert key before|after pivot value (pivot 支点,也就是列表中的一个值,在这里象征着支点)

将一个元素从一个列表移动到另一个列表
rpoplpush source destination (rpop from source lpush destination)


第四种类型--集合类型

高一数学课上学的集合的概念:无序的,不重复的元素的集合。跟这里的集合的概念很接近,他一般用来存储博客文章的标签,就像在CDSN写完文章后每次都会让你选择文章的类别,而且这个类别是无法重复的,比如你设置一个新类别,电脑需要提示你该标签已存在,如果不设置集合的话,我们就需要以这个标签为关键字查询数据库,根据处理结果判断这个标签是否存在,这样的耗时比直接采用集合类型是慢的,更何况还有集合的差集,交集,并集操作了,这些在关系型数据库中需要复杂的sql语句才能实现的功能,在 redis 中都封装好了。

集合类型基本操作:

(s set 集合的意思)
增加,删除集合
sadd key member1 member2 member3 
srem key member1 member2 member3

获取集合内部全部元素
smembers key

判断该元素是否在集合中
sismember key member

集合运算
计算多个集合的差集
sdiff key1 key2 key3 (注意差集的含义)

计算多个集合的交集
sinter key1 key2 key3

并集
sunion key1 key2 key3

获取集合中的元素
scard key

完成上面的集合运算后存储结果
sdiffstore destination key1 key2 key3
sinterstore destination key1 key2 key3
sunionstore destination key1 key2 key3

随机获得集合中的元素
srandmember key [count] 
(当 count 为正时表示获取集合中不重复的 count 个元素,为负时表示获取 count 个可以重复的元素)

随机删除掉集合中的一个元素
spop key


第五种类型--有序集合类型:

前面讲过的集合类型是无序的,但是有时我们需要对这些无序元素进行一个排列时,就要为这些无序元素添加一个变量,score了,可以理解为权重,基本上是 int 的类型,因为有些 score 需要进行一些计算,至于什么时候用到这些 score,就是看个人习惯了,例如我们在 CDSN 上发表博客的时候,总有一些标签的文章经常被用到,那么意味着用户在点击选择标签的时候希望这些标签能在前面被选择,而那些不常用的标签就排列在后面。当然这只是举个例子。

有序集合基本操作命令:

增加元素
zadd key score1 member1 score2 member2 score3 member3 (score 可以设置成 +inf 和 -inf)

获得元素的 score 属性
zscore key member

获得 索引 在一定范围内的 member 的值
zrange key start stop [withscores] (start,stop 的正负含义跟上面一样,在这里表示索引)
zrevrange key start stop [withscores] (上面是从小到大,这个是从大到小排列)

获取 score 在一定范围内的 member 的值
zrangebyscore key min max [withscores] (这里的 min 和 max 表示 score)
zrevrangebyscore key min max [withscore] (跟上面一样)

增加某个 member 的 score 
zincrby key increment member

获得集合中元素的个数
zcard key

获得指定 score 范围内的元素个数,注意是个数,不是真实的元素
zcount key min max

删除一个或多个元素
zrem key member1 member2 member3

按照索引删除范围内的元素
zremrangebyrank key start stop

删除 score 范围内的元素
zremrangebyscore key min max

获得元素的索引
zrank key member
zrevrank key member (逆向索引)

集合计算并且存储计算结果
交集
zinterstore destination key1 key2 key3 [weights weight] aggregate sum|min|max
weight  destination 中元素的个数
sum		key1,key2,key3中 score 的和就是 destination 中的元素的 score 的值
min
max     同理
并集
zunionstore destination key1 ke
到这里就把 redis 的基本五种数据类型介绍完了,书才看了第三章,接下来还有进阶篇,实践篇等等  难过程序猿就是一条不归路啊。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值