小言_互联网的博客

分布式缓存Redis(一) —— 五种数据类型详解

272人阅读  评论(0)

基本概念

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它支持多种类型的数据结构:

  • 字符串(String)
  • 散列(Hash)
  • 列表(List)
  • 集合(Set)
  • 有序集合(ZSet)

与的区别

redis会产生内存碎片

rdb:全量数据备份 => 备份数据
aof:append only if,增量持久化备份 => 备份指令

安装与启动

下载redis压缩包:wget http://download.redis.io/releases/redis-4.0.14.tar.gz
解压:tar -zxvf redis-4.0.14.tar.gz
编译:make MALLOC=libc
安装:cd src && make install
启动服务:./redis-server

使用用守护进程的方式启动Redis

开启守护进程:修改配置文件redis.conf => daemonize yes
(在该模式下,Redis会在后台运行,并将进程pid号写入至redis.conf的pidfile设置的文件中,此时Redis将一直运行,除非手动kill该进程。)
启动服务:./redis-server ../redis.conf
连接客户端:./redis-cli -p 6379

终止Redis:

脚本设置开机自启动

Redis的启动脚本redis_init_script位于其安装目录下/utils/
拷贝redis配置文件:mkdir /etc/redis cp redis.conf /etc/redis/6379.conf
将启动脚本复制到Linux配置自启动/etc/init.d/目录下: cp redis_init_script /etc/init.d/redisd
在启动脚本开头添加如下注释来修改运行级别:
(redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。)

 #!/bin/sh
 # chkconfig:   22345 90 10

开机自启动:chkconfig redisd on

五种数据类型

未安装Redis可在线使用Redis命令 http://try.redis.io/

String类型

可以是字符串、整数或者浮点数。

命令:

  • set / get:设置key对应的值为String类型的value / 获取key对应的值
  • mset / mget:批量设置key及对应的值 / 批量获取多个key对应的值,若不存在返回nil
  • getset:设置key value,并返回key对应的旧值,没有旧值则返回nil
  • incr && incrby:incr对key对应的值进行++操作,并返回新的值;incrby加指定值
  • decr && decrby:decr对key对应的值进行--操作,并返回新的值;decrby减指定值
  • setnx(set if not exists):只有当key不存在时可成功赋值,若key存在则赋值失败,并返回0
  • msetnx:setnx的批量模式,只要有一个key存在(这里name已存在),则全部赋值失败,返回0
  • setexsetex key seconds value 设置key的有效期与对应的value,单位秒
  • getrangegetrange key start end 获取key对应的value的子字符串
  • append:给指定key的value追加字符串,并返回新的字符串的长度

Hash类型

包含键值对的无序散列表。

类似 HashMap<String, HashMap<String, String>>

Hash类型适合存储对象,相当于把一个对象的每个属性存储为String类型,占用更少内存。

所存储的成员较少时,数据存储为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

适用场景:
存储用户信息,商品信息,订单信息等。

命令

  • hset / hget:设置 / 获取key对应的HashMap中field的value
    (再次插入字段相同的值时,覆盖原值(即更新),返回 0 )
  • hmset / hmgethmset key field value [field value ...] hmget key field [field ...]批量设置/获取
  • hsetnxhsetnx key field value: 同String类型,仅当字段不存在时进行赋值操作
  • hgetall:获取key对应的HashMap中的所有field和value
  • hlen:返回key对应的HashMap中字段的个数
  • hdelhdel key field [field ...] 删除key对应的HashMap中的字段(可多字段),返回删除字段的个数

List类型

列表类型可存储一个有序的字符串列表,数据可重复。常用操作是向列表首位添加元素,或者获取列表的某一个片段。

列表类型内部使用双向链表实现,向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。因此,即使列表元素达到千万级别,获取首位部的10条记录也是极快的。

命令:

  • lpushlpush key value [value ...] 在key对应的list的头部添加元素

  • rpushrpush key value [value ...] 在key对应的list的尾部添加元素

  • lrangelrange key start stop 获取key对应的list的指定下标范围的元素(某一片段),索引从 0 开始,-1 表示尾部的元素,0 -1表示获取所有元素。索引可以为负数,如 -3 -1,表示从尾部开始,得到 rval3 rval2 rval1

  • lpop:从key对应的list的头部删除一个元素,并返回该元素

  • rpop:从key对应的list的尾部删除一个元素,并返回该元素

  • llen / lindex:获取列表中元素个数 / 根据索引获得value

  • lrem:根据参数 count 的值,移除列表中与参数 value 相等的元素。
    count 的值可以是以下几种:
    count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    count = 0 : 移除表中所有与 value 相等的值。
    准备些数据

    count 为 1,从表头开始删除 1 个hello

    count为 -2 ,从表尾开始删除 2 个 3

Set类型

即集合类型,数据不可重复且无序。
常用操作是向集合中添加或删除元素,判断某个元素是否存在等。由于集合类型的Redis内部是使用值为空的散列表实现,这些操作的时间复杂度都为O(1)。
Redis提供了多个集合间交集、并集、差集的运算。

Set底层是通过HashMap进行存储,HashMap的key对应set的元素(因此去重),value是空对象

命令:

  • saddsadd key member [member] 在key对应的set中添加元素(去重)
  • smemberssmembers key 获取key对应的set中的所有元素
  • sismembersismember key member 判断元素是否在集合中
  • spopspop key [count] 随机删除key对应的set中的元素(可设置个数),并返回所删除的元素,若不设置个数,默认随机删除一个元素。
  • sremsrem key member [member ...] 删除指定元素,返回删除元素的个数
  • sdiffsdiff key [key ...] 求差集
  • sunionsunion key [key ...] 并集
  • sintersinter key [key ...] 交集

ZSet类型

字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。

set是通过hashmap存储,key对应set的元素,value是空对象。
zset在此基础上另外加了一层跳跃表。

适用场景:
排行榜

有序集合与列表的比较:
二者都是有序,可获得某一范围的元素。
列表类型通过链表实现,获取靠近两端的数据速度极快,而当数据增多后,访问中间数据的速度会变慢;
有序集合类型使用散列表实现,即使读取位于中间部分的数据也很快;
列表中不能简单调整某个元素的位置,但有序集合可以(通过更改score);
有序集合比列表类型更耗内存。

命令:

  • zaddzadd key [NX|XX] [CH] [INCR] score member [score member ...] 在key对应的zset中添加一个或多个元素 (score须是float类型)
  • zrange127.0.0.1:6379> zrange key start stop [WITHSCORES] 获取key对应的zset中指定范围的元素,-1表示获取所有元素
  • zcard:计算元素数量
  • zremzrem key member [member ...] 删除key对应的zset中指定元素
  • zrangebyscorezrangebyscore key min max [WITHSCORES] [LIMIT offset count] 返回有序集合key中,指定分数范围的元素列表,排行榜中运用
  • zrankzrank key member 返回key对应的zset中指定member的排名。其中member按score值递增(从小到大);排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用

消息的发布订阅


使用list类型实现消息发送与消费的一对一模式,使用lpush向list的左端推送数据(发送消息),使用rpop从右端接收数据(消费消息)

redis发布订阅功能比较轻量级,但消息可靠性比较差。

  • publish:将message发送到指定channel,返回收到消息的客户端数量
  • subscribe: 订阅指定频道的消息
  • unsubscribe:取消订阅
    建立了两个订阅客户端,途中退出一个

转载:https://blog.csdn.net/u012211603/article/details/100984507
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场