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


目录

    • 基本概念
      • 与的区别
    • 安装与启动
      • 使用用守护进程的方式启动Redis
      • 脚本设置开机自启动
    • 五种数据类型
      • String类型
      • Hash类型
      • List类型
      • Set类型
      • ZSet类型
    • 消息的发布订阅

基本概念 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(一) —— 五种数据类型详解】开启守护进程:修改配置文件redis.conf => daemonize yes
(在该模式下,Redis会在后台运行,并将进程pid号写入至redis.conf的pidfile设置的文件中,此时Redis将一直运行,除非手动kill该进程。)
启动服务:./redis-server ../redis.conf
连接客户端:./redis-cli -p 6379
分布式缓存Redis(一) —— 五种数据类型详解
文章图片

终止Redis:
分布式缓存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对应的值
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • mset / mget:批量设置key及对应的值 / 批量获取多个key对应的值,若不存在返回nil
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • getset:设置key value,并返回key对应的旧值,没有旧值则返回nil
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • incr && incrby:incr对key对应的值进行++操作,并返回新的值;incrby加指定值
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • decr && decrby:decr对key对应的值进行--操作,并返回新的值;decrby减指定值
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • setnx(set if not exists):只有当key不存在时可成功赋值,若key存在则赋值失败,并返回0
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • msetnx:setnx的批量模式,只要有一个key存在(这里name已存在),则全部赋值失败,返回0
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • setex:setex key seconds value 设置key的有效期与对应的value,单位秒
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • getrange:getrange key start end 获取key对应的value的子字符串
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • append:给指定key的value追加字符串,并返回新的字符串的长度
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
Hash类型
包含键值对的无序散列表。
类似 HashMap>
分布式缓存Redis(一) —— 五种数据类型详解
文章图片

Hash类型适合存储对象,相当于把一个对象的每个属性存储为String类型,占用更少内存。
所存储的成员较少时,数据存储为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
适用场景:
存储用户信息,商品信息,订单信息等。
命令:
  • hset / hget:设置 / 获取key对应的HashMap中field的value
    (再次插入字段相同的值时,覆盖原值(即更新),返回 0 )
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • hmset / hmget:hmset key field value [field value ...] hmget key field [field ...]批量设置/获取
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • hsetnx:hsetnx key field value: 同String类型,仅当字段不存在时进行赋值操作
  • hgetall:获取key对应的HashMap中的所有field和value
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • hlen:返回key对应的HashMap中字段的个数
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • hdel:hdel key field [field ...] 删除key对应的HashMap中的字段(可多字段),返回删除字段的个数
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
List类型
列表类型可存储一个有序的字符串列表,数据可重复。常用操作是向列表首位添加元素,或者获取列表的某一个片段。
列表类型内部使用双向链表实现,向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。因此,即使列表元素达到千万级别,获取首位部的10条记录也是极快的。
命令:
  • lpush:lpush key value [value ...] 在key对应的list的头部添加元素
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

  • rpush:rpush key value [value ...] 在key对应的list的尾部添加元素
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

  • lrange:lrange key start stop 获取key对应的list的指定下标范围的元素(某一片段),索引从 0 开始,-1 表示尾部的元素,0 -1表示获取所有元素。索引可以为负数,如 -3 -1,表示从尾部开始,得到 rval3 rval2 rval1
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

  • lpop:从key对应的list的头部删除一个元素,并返回该元素
  • rpop:从key对应的list的尾部删除一个元素,并返回该元素
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

  • llen / lindex:获取列表中元素个数 / 根据索引获得value
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

  • lrem:根据参数 count 的值,移除列表中与参数 value 相等的元素。
    count 的值可以是以下几种:
    count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    count = 0 : 移除表中所有与 value 相等的值。
    准备些数据
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

    count 为 1,从表头开始删除 1 个hello
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

    count为 -2 ,从表尾开始删除 2 个 3
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

Set类型
即集合类型,数据不可重复且无序。
常用操作是向集合中添加或删除元素,判断某个元素是否存在等。由于集合类型的Redis内部是使用值为空的散列表实现,这些操作的时间复杂度都为O(1)。
Redis提供了多个集合间交集、并集、差集的运算。
Set底层是通过HashMap进行存储,HashMap的key对应set的元素(因此去重),value是空对象
命令:
  • sadd:sadd key member [member] 在key对应的set中添加元素(去重)
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • smembers:smembers key 获取key对应的set中的所有元素
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • sismember:sismember key member 判断元素是否在集合中
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • spop:spop key [count] 随机删除key对应的set中的元素(可设置个数),并返回所删除的元素,若不设置个数,默认随机删除一个元素。
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • srem:srem key member [member ...] 删除指定元素,返回删除元素的个数
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • sdiff:sdiff key [key ...] 求差集
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • sunion:sunion key [key ...] 并集
  • sinter:sinter key [key ...] 交集
ZSet类型
字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。
set是通过hashmap存储,key对应set的元素,value是空对象。
zset在此基础上另外加了一层跳跃表。
适用场景:
排行榜
有序集合与列表的比较:
二者都是有序,可获得某一范围的元素。
列表类型通过链表实现,获取靠近两端的数据速度极快,而当数据增多后,访问中间数据的速度会变慢;
有序集合类型使用散列表实现,即使读取位于中间部分的数据也很快;
列表中不能简单调整某个元素的位置,但有序集合可以(通过更改score);
有序集合比列表类型更耗内存。
命令:
  • zadd:zadd key [NX|XX] [CH] [INCR] score member [score member ...] 在key对应的zset中添加一个或多个元素 (score须是float类型)
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • zrange:127.0.0.1:6379> zrange key start stop [WITHSCORES] 获取key对应的zset中指定范围的元素,-1表示获取所有元素
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • zcard:计算元素数量
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • zrem:zrem key member [member ...] 删除key对应的zset中指定元素
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • zrangebyscore:zrangebyscore key min max [WITHSCORES] [LIMIT offset count] 返回有序集合key中,指定分数范围的元素列表,排行榜中运用
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
  • zrank:zrank key member 返回key对应的zset中指定member的排名。其中member按score值递增(从小到大);排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片
消息的发布订阅 分布式缓存Redis(一) —— 五种数据类型详解
文章图片

使用list类型实现消息发送与消费的一对一模式,使用lpush向list的左端推送数据(发送消息),使用rpop从右端接收数据(消费消息)
redis发布订阅功能比较轻量级,但消息可靠性比较差。
  • publish:将message发送到指定channel,返回收到消息的客户端数量
  • subscribe: 订阅指定频道的消息
  • unsubscribe:取消订阅
    建立了两个订阅客户端,途中退出一个
    分布式缓存Redis(一) —— 五种数据类型详解
    文章图片

    推荐阅读