一.redis基础之---数据类型string篇 有更新!

  , ,
评论 • 195 浏览

(一)redis基础之—数据类型string篇

redis是什么

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

环境配置

这里不详细说明redis的配置与安装了。请自行去官网下载安装。

redis数据类型

本来想把redis全部类型放在一篇文章里面介绍的,后来发现太长了,就分散拆开了。

Redis keys

redis key通常会被人所忽视。
但是key对性能及后续排查的可读性也是相当重要的。一般来说,key的设计遵循以下几个规则:

  • 可读性和可管理性
    以业务名(或数据库名)为前缀,用冒号隔开,比如业务名:表名:id。
cosmos:mars:1
  • 简洁性。
    在保证语义的前提下,控制key的长度。key值太长的话,对内存消耗是很大的,而且在数据查找这类键值的计算成本很高。

  • 【强制】不要包含特殊字符。

Redis string

redis的string类型是最简单的值类型。
可以使用set赋值,get来取一个值。

127.0.0.1:6379> set mykey wangqianjun
OK
127.0.0.1:6379> get mykey
"wangqianjun"
127.0.0.1:6379>

可以添加nx参数来判断秘钥是否存在,如果存在的话返回失败,如果不存在的话返回成功。xx参数正好相反。

127.0.0.1:6379> set mykey wangqianjun
OK
127.0.0.1:6379> set mykey wangqianjun nx
(nil)
127.0.0.1:6379> set pk wangqianjun nx
OK
127.0.0.1:6379> set zk wangqianjun xx
(nil)
127.0.0.1:6379> set pk wangqianjun xx
OK

可以通过incr,decr等操作来对值进行增减操作。如:

127.0.0.1:6379> set counter 100
OK
127.0.0.1:6379> incr counter
(integer) 101
127.0.0.1:6379> incrby counter 50
(integer) 151
127.0.0.1:6379> decr counter
(integer) 150
127.0.0.1:6379> decrby counter 10
(integer) 140

可以使用mset,mget来进行多个值操作。

127.0.0.1:6379> mset a 10 b 20
OK
127.0.0.1:6379> mget a b
1) "10"
2) "20"

可以通过exists,del,expire来查看key是否存在,删除,超时等操作。

127.0.0.1:6379> set key1 10000
OK
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379> set key2 abcd
OK
127.0.0.1:6379> expire key2 3
(integer) 1
127.0.0.1:6379> get key2
(nil)

这里不再举例,具体命令请参考redis官方文档

前方高能预警!
下面的知识属于拓展知识,和底层相关,只是查询的话无需阅读。

redis的string和我们语言中的string是不太一样的,并不是说string类型只能存储string字符串。事实上string类型的编码可以是intrawembstr

int
如果一个字符串里面保存的是一个long类型的整数,那么redis会将值保存在字符串对象结构的ptr属性里面。并将encoding设置为int。

     127.0.0.1:6379> set vx 1000
    OK
    127.0.0.1:6379> object encoding vx
    "int"

raw
如果值是一个字符串,并且字符串长度大于32个字节,那么字符串对象将会用一个简单动态字符串SDS来保存。并且将对象的编码设置为raw。

127.0.0.1:6379> set zx qddwqdwvwdwqdwqqcqdwqwqwqdwqddwqdzcqqwdwqqwdwqdwqdwqdwqdwqdsdwqdwqddwqd
OK
127.0.0.1:6379> object encoding zx
"raw"

embstr
如果值是一个字符串,并且字符串长度小于32个字节,将会使用embstr的方式来保存这个值。

127.0.0.1:6379> set mx wqeq
OK
127.0.0.1:6379> object encoding mx
"embstr"

那么为什么既要有embstr也要有raw呢?
为什么不统一使用raw来保存字符串呢?

其实是这样的。
使用raw来创建字符串的时候redis会进行两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr则调用一次内存分配函数来分配一块连续的空间,空间中依次包含redisObject和sdshdr两个结构。因此,embstr会带来性能上的提升。一般用embstr会有以下好处:

  •  embstr编码将创建字符串所需要的内存分配降为一次。
  •  释放embstr编码的字符串对象只需要调用一次内存释放函数,而raw编码需要调用两次内存释放函数。
  •  因为embstr编码的字符串对象的所有数据都保存在一块连续内存里面,所以这种编码比起raw编码的对象能够更好的利用缓存带来的优势。

最后,对于int编码的字符串对象来说,如果我们向对象执行了一些命令,使得对象存的在是整数,而是字符串值,那么该字符串对象的编码将会从int变为raw。

127.0.0.1:6379> set mx 1000
OK
127.0.0.1:6379> object encoding mx
"int"
127.0.0.1:6379> append mx " a"
(integer) 6
127.0.0.1:6379> object encoding mx
"raw"

另外,因为redis没有为rmbstr编码的字符串对象编写任何相应的修改程序,所以embstr编码的字符串实际上是只读的,当我们对embstr编码的字符串执行任何修改命令时,对象的编码都会从embstr变成raw。

评论
validate