1.String
字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。
字符串结构使用最为广泛,最常见的就是缓存信息。一般情况下我们是将这些信息使用JSON序列化成字符串,然后将序列化后的字符串塞进Redis进行缓存,同样,获取用户信息的时候是会进行一次反序列化的过程。
字符串是由多个字节组成,每个字节又是由 8 个 bit 组成,如此便可以将一个字符串看成很多 bit 的组合,这便是 bitmap「位图」数据结构。
Java中的字符串是常量,知道String pool的同学应该很明白这句话的含义,但Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。可以看到扩容机制和Java中的ArrayList有所不同。
键值对:
127.0.0.1:6379> set name xiaoming OK 127.0.0.1:6379> get name "xiaoming" 127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil)
批量键值对:
127.0.0.1:6379> mset name1 xiaoming1 name2 xiaoming2 OK 127.0.0.1:6379> get name1 "xiaoming1" 127.0.0.1:6379> get name2 "xiaoming2" 127.0.0.1:6379> mget name1 name2 1) "xiaoming1" 2) "xiaoming2"
过期和set:
127.0.0.1:6379> set myName xiaoming OK 127.0.0.1:6379> get myName "xiaoming" 127.0.0.1:6379> expire myName 5 (integer) 1 127.0.0.1:6379> get myName (nil) 127.0.0.1:6379> setex myName1 5 xiaoming OK 127.0.0.1:6379> get myName (nil) 127.0.0.1:6379> setnx myName2 xiaoming (integer) 1 127.0.0.1:6379> get myName2 "xiaoming"
计数:
127.0.0.1:6379> set age 30 OK 127.0.0.1:6379> get age "30" 127.0.0.1:6379> incr age (integer) 31 127.0.0.1:6379> get age "31" 127.0.0.1:6379> 127.0.0.1:6379> incrby age 5 (integer) 36 127.0.0.1:6379> set age 9223372036854775807 OK 127.0.0.1:6379> incr age (error) ERR increment or decrement would overflow