5、redis丰富的数据结构支持(1)

时间:2019-04-18
本文章向大家介绍5、redis丰富的数据结构支持(1),主要包括5、redis丰富的数据结构支持(1)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

学习目标:

1、了解Redis的类型介绍

2、了解各种类型的基本使用

学习过程:

      Redis强大之处就是在于其丰富的数据类型。Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

1、String(字符串)

    string是redis最基本的类型,一个key对应一个value。字符串是由多个字节组成,可以将一个字符串看成很多 bit 的组合,意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 ,一个键最大能存储512MB。

   redis的string的值采用动态扩容的,redis会预分配冗余空间的方式来减少内存的频繁分配,capacity 一般要高于实际字符串长度 len。扩容规则时当字符串长度小于 1M 时,扩容是现有大小的一倍,如果超过 1M,扩容一次只会多扩 1M 的空间,以免空间浪费。看一下最简单的操作。

redis 127.0.0.1:6379> SET name "liubao"

OK

redis 127.0.0.1:6379> GET name

"liubao"

在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 liubao。

整型和其他数字类型的数据也可以归类为String类型,只是如果时整型的数据会支持incr 等命令

192.168.137.101:0>set age 10

"OK"
192.168.137.101:0>type age

"string"  也是字符串
192.168.137.101:0>incr age

"11"

3、List(列表)

   Redis 列表是简单的字符串列表,按照插入顺序排序。redis的列表结构和链表差不多,也就是插入和删除都是O(1)的,速度很快,但是随机读取就比较慢了。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。或者从头部或尾部弹出数据,我们可以使用Redis的列表实现消息队列的功能,数据量不是很大的时候,效率比RabbitMQ等其他的队列工具更高,但是并不具有消息队列的其他功能,所以一般还是很少人在生产环境中作为消息队列使用。

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

实例

127.0.0.1:6379> lpush mylist one  #从左边push,一次一个

(integer) 1

127.0.0.1:6379> lpush mylist two three  一次多个

(integer) 3

127.0.0.1:6379> lrange mylist 0 3   #  后面一个参数可以参数-1就可以把所有的都拿出来,遍历其实挺慢的,lrange 命令也支持负索引,表是从右边开始计算序数,如 ' -1 ' 表示最右边第一个元素, ' -2 ' 表示最右边第二个元素,一次类推

1) "three"

2) "two"

3) "one"

127.0.0.1:6379> rpush mylist haha  从右边push

(integer) 4

127.0.0.1:6379> lrange mylist 0 10

1) "three"

2) "two"

3) "one"

4) "haha"

    从列表两端弹出元素

        lpop mylist 效率较高

        rpop mylist

        lpop 命令可以从列表左边弹出一个元素,lpop 命令执行两步操作,1:将列表左边的元素从列表中移除,2:返回被移除元素值

        rpop 命令可以从列表右边弹出一个元素

    获取列表中元素个数

        llen key

        当键不存在时,llen 返回 0

    删除列表中指定的值

        lrem key count value

        lrem 命令会删除列表中前 count 个值为 value 的元素,返回值是实际删除的元素个数。根据count 值的不同,lrem 命令执行的方式会

            略有差异

            当 count > 0 时,lrem 命令会从列表左边开始删除前 count 个值为 value 的元素

            当 count < 0 时,lrem 命令会从列表右边开始删除前count 个值为 value 的元素

            当 count = 0 时,lrem 命令会删除所有值为value的元素

 

    获得 / 设置 指定索引的元素值

        lindex key index

        lset key index value

        lindex 命令用来返回指定索引的元素,索引从 0 开始 ,如果 index 是负数则表示从右边开始计算的索引,最右边元素的索引是 -1 

        lset 是通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value 

 

    只保留列表指定片段

        ltrim key start end

        ltrim 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和 lrange 命令相同

        ltrim 命令常和 lpush 命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的 100 条日志,则每次加入新元素时

            调用一次ltrim 命令即可;

 

    向列表中插入元素

        linsert key before | after pivot value

        linsert 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 before 还是 after 来决定将 value 插入到该元素的

            前面还是后面,如果命令执行成功,返回插入操作完成之后列表的长度。如果没有找到 pivot 返回 -1 如果key 不存在或为空,返回 0

            

    将元素从一个列表转到另一个列表R

        rpoplpush source destination

        rpoplpush 先执行 rpop 命令在执行 lpush 命令。rpoplpush 命令先会从source 列表类型键的右边弹出一个元素,然后将其加入到 destination 列表类型键的左边,并返回这个元素的值,整个过程是原子的

 

3、Hash(哈希)

    Redis hash 是一个键值(key=>value)对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。hash在储存时也是动态扩容的,redis使用渐进式 rehash ,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务中以及 hash 操作指令中,循序渐进地将旧 hash 的内容一点点迁移到新的 hash 结构中。当搬迁完成了,就会使用新的hash结构取而代之。

实例

redis> HMSET myhash field1 "value1" field2 "value2"

"OK"

redis> HGET myhash field1

"value1"

redis> HGET myhash field2

"value2"

    以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。每个 hash 可以存储 232 -1 键值对(40多亿)。

其他常用命令:

    赋值与取值

        hset key field value

        hget key field

        hmset key field value [ field value ...... ]

        hmget key field [ field ...... ]

        hgetall key

        hset 命令用来给字段赋值,而hget命令用来获得字段的值

        hset 命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作还是更新操作,当执行的是插入操作时, hset 命令返回 1 ,当执行的是更新操作时,hset 命令返回的是 0 ,当键本身不存在时, 判断字段是否存在

        hexists key field

        存在返回 1 ,否则返回 0

    当字段不存在时赋值

        hsetnx key field value

        hsetnx 命令与hset 命令类似,区别在于如果字段已经存在,hsetnx 命令将不执行任何操

    增加数字

        hincrby key field increment

        使字段值增加指定的整数

    删除字段

        hdel key field [ field .....]

        删除一个或多个字段,返回值是被删除的字段个数

    只获取字段名或字段值

        hkeys key

        hvals key

        hkeys 获取所有字段的名字

        hvals 获得键中所有字段的值

    获得字段数量

        hlen key