目录
- 基本概念
- 与的区别
- 安装与启动
- 使用用守护进程的方式启动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_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
文章图片
- setex:
setex key seconds value
设置key的有效期与对应的value,单位秒
文章图片
- getrange:
getrange key start end
获取key对应的value的子字符串
文章图片
- append:给指定key的value追加字符串,并返回新的字符串的长度
文章图片
包含键值对的无序散列表。
类似
HashMap>
文章图片
Hash类型适合存储对象,相当于把一个对象的每个属性存储为String类型,占用更少内存。
所存储的成员较少时,数据存储为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
适用场景:
存储用户信息,商品信息,订单信息等。
命令:
- hset / hget:设置 / 获取key对应的HashMap中field的value
(再次插入字段相同的值时,覆盖原值(即更新),返回 0 )
文章图片
- hmset / hmget:
hmset key field value [field value ...]
hmget key field [field ...]
批量设置/获取
文章图片
- hsetnx:
hsetnx key field value
: 同String类型,仅当字段不存在时进行赋值操作 - hgetall:获取key对应的HashMap中的所有field和value
文章图片
- hlen:返回key对应的HashMap中字段的个数
文章图片
- hdel:
hdel key field [field ...]
删除key对应的HashMap中的字段(可多字段),返回删除字段的个数
文章图片
列表类型可存储一个有序的字符串列表,数据可重复。常用操作是向列表首位添加元素,或者获取列表的某一个片段。
列表类型内部使用双向链表实现,向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。因此,即使列表元素达到千万级别,获取首位部的10条记录也是极快的。
命令:
- lpush:
lpush key value [value ...]
在key对应的list的头部添加元素
文章图片
- rpush:
rpush key value [value ...]
在key对应的list的尾部添加元素
文章图片
- lrange:
lrange 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
文章图片
即集合类型,数据不可重复且无序。
常用操作是向集合中添加或删除元素,判断某个元素是否存在等。由于集合类型的Redis内部是使用值为空的散列表实现,这些操作的时间复杂度都为O(1)。
Redis提供了多个集合间交集、并集、差集的运算。
Set底层是通过HashMap进行存储,HashMap的key对应set的元素(因此去重),value是空对象
命令:
- sadd:
sadd key member [member]
在key对应的set中添加元素(去重)
文章图片
- smembers:
smembers key
获取key对应的set中的所有元素
文章图片
- sismember:
sismember key member
判断元素是否在集合中
文章图片
- spop:
spop key [count]
随机删除key对应的set中的元素(可设置个数),并返回所删除的元素,若不设置个数,默认随机删除一个元素。
文章图片
- srem:
srem key member [member ...]
删除指定元素,返回删除元素的个数
文章图片
- sdiff:
sdiff key [key ...]
求差集
文章图片
- sunion:
sunion key [key ...]
并集 - sinter:
sinter key [key ...]
交集
字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。
set是通过hashmap存储,key对应set的元素,value是空对象。
zset在此基础上另外加了一层跳跃表。
适用场景:
排行榜
有序集合与列表的比较:
二者都是有序,可获得某一范围的元素。
列表类型通过链表实现,获取靠近两端的数据速度极快,而当数据增多后,访问中间数据的速度会变慢;
有序集合类型使用散列表实现,即使读取位于中间部分的数据也很快;
列表中不能简单调整某个元素的位置,但有序集合可以(通过更改score);
有序集合比列表类型更耗内存。
命令:
- zadd:
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
在key对应的zset中添加一个或多个元素 (score须是float类型)
文章图片
- zrange:
127.0.0.1:6379> zrange key start stop [WITHSCORES]
获取key对应的zset中指定范围的元素,-1表示获取所有元素
文章图片
- zcard:计算元素数量
文章图片
- zrem:
zrem key member [member ...]
删除key对应的zset中指定元素
文章图片
- zrangebyscore:
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
返回有序集合key中,指定分数范围的元素列表,排行榜中运用
文章图片
- zrank:
zrank key member
返回key对应的zset中指定member的排名。其中member按score值递增(从小到大);排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用
文章图片
文章图片
使用list类型实现消息发送与消费的一对一模式,使用lpush向list的左端推送数据(发送消息),使用rpop从右端接收数据(消费消息)
redis发布订阅功能比较轻量级,但消息可靠性比较差。
- publish:将message发送到指定channel,返回收到消息的客户端数量
- subscribe: 订阅指定频道的消息
- unsubscribe:取消订阅
建立了两个订阅客户端,途中退出一个
文章图片
推荐阅读
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- 谈灾难恢复指标(RTO与RPO是什么鬼())
- RPO与RTO
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...