Redis篇 ——1.1 Redis基础数据结构

Redis 有 5 种基础数据结构,分别为:String、list、set、hash、zet五种数据类型 

string (字符串)

> set name string
OK
> get name
"string"
> exists name
(integer) 1
> del name
(integer) 1
字符串String 是Redis 最简单的数据结构。在Redis中所有的数据结构都是以键值对的形式存在,都是以唯一的key字符串作为名称,然后通过唯一的key来获取value,对于不同的数据结构来说,其实就是value结构的不同。

String的数据结构用途十分的广泛:常用于用户信息的存储,把用户信息通过序列化成JSON格式数据存储到redis中,在获取的只需要通过key获取出json数据,然后反序列化就可以。

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

字符串常用命令:

  1. set(key, value):给数据库中名称为key的string赋予值value

  2. get(key):返回数据库中名称为key的string的value

  3. getset(key, value):给名称为key的string赋值value,并返回上一次的值,如果key不存在,则会创建一个新的key,返回nil。

  4. mget(key1, key2,…, keyN):返回库中多个string(它们的名称为key1,key2…)的value
  5. setnx(key,value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
  6. setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
  7. mset(key1, value1, key2, value2,…key N, value N)给多个string赋值,名称为key i的string赋值value i
  8. msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i
  9. incr(key):名称为key的string增1操作
  10. incrby(key, integer):名称为key的string增加integer
  11. decr(key):名称为key的string减1操作
  12. decrby(key, integer):名称为key的string减少integer
  13. append(key, value):名称为key的string的值附加value
  14. substr(key, start, end):返回名称为key的string的value的子串

补充:批量键值对.可以节省网络的消耗

对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。不过
这个「自动删除」的机制是比较复杂的,如果你感兴趣,可以继续深入阅读,后面有文章介绍

计数

如果 value 值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是
signed long 的最大最小值,超过了这个值, Redis 会报错。
> set age 20
OK
> incr age
(integer) 21
> incrby age 4
(integer) 25
> incrby age -5
(integer) 30
> set codehole 9223372036854775807
# Long.Max
OK
> incr codehole
(error) ERR increment or decrement would overflow

Redis 3.2之后,为了支持bitmap(位图),后面会单独描述

list (列表)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

Redis 的列表相当于 Java 里面的 LinkedList,因为它是链表结构而不是数组。这意味list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为O(n)
                当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
Redis 的列表结构常用来做异步队列使用。 将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理

右边进左边出(先进后出):队列

> rpush key one two three
(integer) 3
> lpop key
"one"
> lpop key
"two"
> lpop key
"three"
> lpop key
(nil)

右边进右边出(先进先出):栈

> rpush key one two three
(integer) 3
> llen key
(integer) 3
> rpop key
"three"
> rpop key
"two"
> rpop key
"one"
> rpop key
(nil)

索引定位(慢操作)

lindex 相当于 Java 链表的 get(int index)方法,它需要对链表进行遍历,性能随着参数index 增大而变差。ltrim 的两个参数 start_index 和 end_index 定义了一个区间,在这个区间内的值,ltrim 要保留,区间之外统统砍掉。我们可以通过 ltrim来实现一个定长的链表,这一点非常有用。 index 可以为负数, index=-1 表示倒数第一个元素,同样 index=-2 表示倒数第二个元素
> rpush key one two three
(integer) 3
> lindex key 1   #获取指定索引数据  慎用 时间复杂度O(n)
"two"
> lrange key 0 -1  #获取所以数据    慎用 时间复杂度O(n)
1) "one"
2) "two"
3) "three"
> ltrim  key 1 -1  #保留指定范围数据  
OK
> lrange key 0 -1  
1) "two"
2) "three"
> ltrim  key 1 0  #相当于删除所有数据
OK
> llen books  
(integer) 0

待续:

你可能感兴趣的:(redis)