字符串String是Redis最简单最常用的数据结构,它的内部表示就是一个字符数组,如图所示。Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过这个唯一key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样

 

image.png

 

 

一、存储

      Redis的字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图2所示,内部为当前字符串分配的实际空间capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间。字符串最大长度为512MB

image.png

                           

二、Redis命令

     1.键值对

      相当于字典的key和value,支持简单的增删改查操作。下面代码中的“name”就是字典的key,而value就是字符串"zhangsan"。

> set name zhangsan
 OK
> get name
 "zhangsan"
> exists name
 (integer) 1
> del name
 (integer) 1
> get name 
 (nil)

 

2.批量键值对

可以对多个字符串进行批量读写,节省网络耗时开销

> mset name1 zhangsan name2 lisi name3 wanger
OK

> mget name1 name2 name3  # 返回的是一个列表
1) "zhangsan"
2) "lisi"
3) "wanger"

> mget name1 name2 name3 name4
1) "zhangsan"
2) "lisi"
3) "wanger"
4) (nil)

 

3.过期和set命令拓展

可以对key设置过期时间,到时间会被自动删除,这个功能常用来设置缓存的失效时间。

> set name zhangsan
 OK
> get name
 "zhangsan"
 
> expire name 5  # 5s 后过期
 (integer) 1
 
...              # 等5s
> get name
 (nil)
 
> setex name 5 zhangsan  # 5s后过期,等价于set+expire
 OK

> get name
"zhangsan"

...              # 等5s
> get name
(nil)


> setnx name zhangsan # 如果name不存在就执行set创建
(integer) 1

> setnx name lisi     
(integer) 0        # name已经存在,不会set成功

> get name            
"zhangsan"         # 没有改变

 

4.计数

如果value值是一个整数,可以对它进行自增操作。自增是有范围的,它的范围在signed long的最大值和最小值之间,超出这个范围Redis会报错。

> set age 18
OK
> incr age
(integer) 19
> incrby age 10 
(integer) 29
> incrby age -5   #相当于减5
(integer) 24

三、使用场景

     字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们可以将用户信息结构序列化为JSON字符串,然后将字符串放到Redis来缓存,同样取用户信息时经过一次反序列化的过程

 

 

 

 

END

 

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

 

一大波微服务、分布式、高并发、高可用原创系列文章正在路上,欢迎扫描下方二维码,持续关注:

 

 

qrcode_for_gh_fa294c4487f9_430 (3).jpg

文玥公子

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐