字符串String是Redis最简单最常用的数据结构,它的内部表示就是一个字符数组,如图所示。Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过这个唯一key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。
一、存储
Redis的字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图2所示,内部为当前字符串分配的实际空间capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间。字符串最大长度为512MB。
二、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
如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!
一大波微服务、分布式、高并发、高可用的原创系列文章正在路上,欢迎扫描下方二维码,持续关注:
文玥公子