redis系列–你真的入门了吗?【美高梅59599】redis4.0入门~

redis系列–你真的入门了吗?【美高梅59599】redis4.0入门~

前言

redis作为nosql家族中非常热门的一员,也是被大型互联网公司所青睐,无论你是开发、测试或者运维,学习掌握它总会为你的职业生涯增色添彩。

当然,你或多或少已经了解redis,但是你是否了解其中的某些细节,本片文章将详细介绍redis基础,后续也会介绍其高级部分如、持久化、复制、集群等内容,希望对你有所帮助。

自redis3.0发布已经3年了,redis目前官方提供的redis稳定版本是4.0,以下示例均在4.0版本上进行。

redis-订阅与发布

Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式,
这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式,
下文先讨论订阅/发布到频道的实现, 再讨论订阅/发布到模式的实现。

一、redis简介

频道的订阅与信息发送

Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道,
每当有新信息发送到被订阅的频道时,
信息就会被发送给所有订阅指定频道的客户端。

作为例子, 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 ——
client2 、 client5 和 client1 之间的关系:

美高梅59599 1

当有新消息通过 PUBLISH 命令发送给频道 channel1 时,

这个消息就会被发送给订阅它的三个客户端:

美高梅59599 2

在后面的内容中, 我们将探讨 SUBSCRIBE 和 PUBLISH 命令的实现,
以及这套订阅与发布机制的运作原理。

概述

redis(REmote DIctionary Server)是一个由Salvatore
Sanfilippo写key-value存储系统,它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted
set
–有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,redis在3.0版本推出集群模式。

订阅频道

每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer
结构, 结构的 pubsub_channels 属性是一个字典,
这个字典就用于保存订阅频道的信息:

struct redisServer {
    // ...
    dict *pubsub_channels;
    // ...
};

其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表,
链表中保存了所有订阅这个频道的客户端。

比如说,在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和
client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅:

美高梅59599 3

当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在
pubsub_channels 字典中关联起来。

举个例子,如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2
channel3 ,那么前面展示的 pubsub_channels 将变成下面这个样子:

美高梅59599 4

SUBSCRIBE 命令的行为可以用伪代码表示如下:

def SUBSCRIBE(client, channels):

    # 遍历所有输入频道
    for channel in channels:

        # 将客户端添加到链表的末尾
        redisServer.pubsub_channels[channel].append(client)

通过 pubsub_channels 字典, 程序只要检查某个频道是否为字典的键,
就可以知道该频道是否正在被客户端订阅; 只要取出某个键的值,
就可以得到所有订阅该频道的客户端的信息。

特点、优势

  • k、v键值存储以及数据结构存储(如列表、字典)
  • 所有数据(包括数据的存储)操作均在内存中完成
  • 单线程服务(这意味着会有较多的阻塞情况),采用epoll模型进行请求响应,对比nginx
  • 支持主从复制模式,更提供高可用主从复制模式(哨兵)
  • 去中心化分布式集群
  • 丰富的编程接口支持,如Python、Golang、Java、php、Ruby、Lua、Node.js 
  • 功能丰富,除了支持多种数据结构之外,还支持事务、发布/订阅、消息队列等功能
  • 支持数据持久化(AOF、RDB)

发送信息到频道

了解了 pubsub_channels 字典的结构之后, 解释 PUBLISH
命令的实现就非常简单了: 当调用 PUBLISH channel message 命令,
程序首先根据 channel 定位到字典的键,
然后将信息发送给字典值链表中的所有客户端。

比如说,对于以下这个 pubsub_channels 实例, 如果某个客户端执行命令
PUBLISH channel1 “hello moto” ,那么 client2 、 client5 和 client1
三个客户端都将接收到 “hello moto” 信息:

美高梅59599 5

PUBLISH 命令的实现可以用以下伪代码来描述:

def PUBLISH(channel, message):

    # 遍历所有订阅频道 channel 的客户端
    for client in server.pubsub_channels[channel]:

        # 将信息发送给它们
        send_message(client, message)

对比memcache

  • memcache是一个分布式的内存对象缓存系统,并不提供持久存储功能,而redis拥有持久化功能
  • memcache数据存储基于LRU(简单说:最近、最少使用key会被剔除),而redis则可以永久保存(服务一直运行情况下)
  • memcache是多线程的(这是memcache优势之一),也就意味着阻塞情况少,而redis是单线程的,阻塞情况相对较多
  • 两者性能上相差不大
  • memcache只支持简单的k、v数据存储,而redis支持多种数据格式存储。
  • memcache是多线程、非阻塞IO复用网络模型,而redis是单线程IO复用模型

退订频道

使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作:
它从 pubsub_channels 字典的给定频道(键)中,
删除关于当前客户端的信息,
这样被退订频道的信息就不会再发送给这个客户端。

二、开始

模式的订阅与信息发送

当使用 PUBLISH 命令发送信息到某个频道时,
不仅所有订阅该频道的客户端会收到信息,
如果有某个/某些模式和这个频道匹配的话,
那么所有订阅这个/这些频道的客户端也同样会收到信息。

下图展示了一个带有频道和模式的例子, 其中 tweet.shop.* 模式匹配了
tweet.shop.kindle 频道和 tweet.shop.ipad 频道,
并且有不同的客户端分别订阅它们三个:

美高梅59599 6

当有信息发送到 tweet.shop.kindle 频道时, 信息除了发送给 clientX 和
clientY 之外, 还会发送给订阅 tweet.shop.* 模式的 client123 和
client256 :

美高梅59599 7

另一方面, 如果接收到信息的是频道 tweet.shop.ipad , 那么 client123 和
client256 同样会收到信息:

美高梅59599 8

源码部署

yum install gcc -y  #安装C依赖
wget http://download.redis.io/redis-stable.tar.gz  #下载稳定版本
tar zxvf redis-stable.tar.gz  #解压
cd redis-stable
make PREFIX=/opt/app/redis install   #指定目录编译,也可以不用指定
make install
mkdir /etc/redis   #建立配置目录
cp redis.conf /etc/redis/6379.conf # 拷贝配置文件
cp utils/redis_init_script /etc/init.d/redis  #拷贝init启动脚本针对6.X系统
chmod a+x  /etc/init.d/redis  #添加执行权限
vi /etc/redis/6379.conf #修改配置文件: 
bind 0.0.0.0      #监听地址
maxmemory 4294967296   #限制最大内存(4G):
daemonize yes   #后台运行

####启动与停止
/etc/init.d/redis start
/etc/init.d/redis stop

查看是否成功安装

#执行客户端工具
redis-cli 
#输入命令info
127.0.0.1:6379> info
# Server
redis_version:4.0.10
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:cf83e9c690dbed33
redis_mode:standalone
os:Linux 2.6.32-642.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll

订阅模式

redisServer.pubsub_patterns
属性是一个链表,链表中保存着所有和模式相关的信息:

struct redisServer {
    // ...
    list *pubsub_patterns;
    // ...
};

链表中的每个节点都包含一个 redis.h/pubsubPattern 结构:

typedef struct pubsubPattern {
    redisClient *client;
    robj *pattern;
} pubsubPattern;

client 属性保存着订阅模式的客户端,而 pattern 属性则保存着被订阅的模式。

每当调用 PSUBSCRIBE 命令订阅一个模式时,
程序就创建一个包含客户端信息和被订阅模式的 pubsubPattern 结构,
并将该结构添加到 redisServer.pubsub_patterns 链表中。

作为例子,下图展示了一个包含两个模式的 pubsub_patterns 链表, 其中
client123 和 client256 都正在订阅 tweet.shop.* 模式:

美高梅59599 9

如果这时客户端 client10086 执行 PSUBSCRIBE broadcast.list.* , 那么
pubsub_patterns 链表将被更新成这样:

美高梅59599 10

通过遍历整个 pubsub_patterns
链表,程序可以检查所有正在被订阅的模式,以及订阅这些模式的客户端。

二进制文件说明

redis安装完成后会有以下可执行文件(window下是exe文件)生成,下面是各个文件的作用。

redis-server       #Redis服务器和Sentinel服务器,启动时候可使用--sentinel指定为哨兵
redis-cli         #Redis命令行客户端 
redis-benchmark      #Redis性能测试工具 
redis-check-aof      #AOF文件修复工具 
redis-check-dump     #RDB文件检测工具 
redis-sentinel       #Sentinel服务器,4.0版本已经做了软链接到redis-server

发送信息到模式

发送信息到模式的工作也是由 PUBLISH 命令进行的, 在前面讲解频道的时候,
我们给出了这样一段伪代码, 说它定义了 PUBLISH 命令的行为:

def PUBLISH(channel, message):

    # 遍历所有订阅频道 channel 的客户端
    for client in server.pubsub_channels[channel]:

        # 将信息发送给它们
        send_message(client, message)

但是,这段伪代码并没有完整描述 PUBLISH 命令的行为, 因为 PUBLISH 除了将
message 发送到所有订阅 channel 的客户端之外, 它还会将 channel 和
pubsub_patterns 中的模式进行对比, 如果 channel 和某个模式匹配的话,
那么也将 message 发送到订阅那个模式的客户端。

完整描述 PUBLISH 功能的伪代码定于如下:

def PUBLISH(channel, message):

    # 遍历所有订阅频道 channel 的客户端
    for client in server.pubsub_channels[channel]:

        # 将信息发送给它们
        send_message(client, message)

    # 取出所有模式,以及订阅模式的客户端
    for pattern, client in server.pubsub_patterns:

        # 如果 channel 和模式匹配
        if match(channel, pattern):

            # 那么也将信息发给订阅这个模式的客户端
            send_message(client, message)

举个例子,如果 Redis 服务器的 pubsub_patterns 状态如下:

美高梅59599 11

那么当某个客户端发送信息 “Amazon Kindle, $69.” 到 tweet.shop.kindle
频道时, 除了所有订阅了 tweet.shop.kindle 频道的客户端会收到信息之外,
客户端 client123 和 client256 也同样会收到信息, 因为这两个客户端订阅的
tweet.shop.* 模式和 tweet.shop.kindle 频道匹配。

三、配置详解

redis所有的配置参数都可以通过客户端通过“CONFIG GET 参数名”
获取,参数名支持通配符,如*代表所有。所得结果并按照顺序分组,第一个返回结果是参数名,第二个结果是参数对应的值。

美高梅59599 12

除了查看配置还可以使用CONFIG SET修改配置,写入配置文件使用CONFIG
REWRITE,使用时是需要注意某些关于服务配置参数慎重修改,如bind。

美高梅59599 13

配置参数以及解释,需要注意的是,有些配置是4.0.10新增的,有些配置已经废除,如vm相关配置,和集群相关配置在集群篇章在进行补充。

logfile
#日志文件位置及文件名称

bind 0.0.0.0
#监听地址,可以有多个 如bind 0.0.0.0 127.0.0.1

daemonize yes
#yes启动守护进程运行,即后台运行,no表示不启用

pidfile /var/run/redis.pid 
# 当redis在后台运行的时候,Redis默认会把pid文件在在/var/run/redis.pid,也可以配置到其他地方。
# 当运行多个redis服务时,需要指定不同的pid文件和端口

port 6379
# 指定redis运行的端口,默认是6379

unixsocket 
#sock文件位置

unixsocketperm
#sock文件权限

timeout 0
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接, 0是关闭此设置

loglevel debug
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

logfile ""
# 日志文件配置,默认值为stdout,标准输出,若后台模式会输出到/dev/null

syslog-enabled
# 是否以syslog方式记录日志,yes开启no禁用,与该配置相关配置syslog-ident 和syslog-facility local0 分别是指明syslog的ident和facility

databases 16
#配置可用的数据库个数,默认值为16,默认数据库为0,数据库范围在0-(database-1)之间

always-show-logo yes #4.0以后新增配置
#是否配置日志显示redis徽标,yes显示no不显示


################################ 快照相关配置 #################################

save 900 1
save 300 10
save 60 10000
#配置快照(rdb)促发规则,格式:save <seconds> <changes>
#save 900 1  900秒内至少有1个key被改变则做一次快照
#save 300 10  300秒内至少有300个key被改变则做一次快照
#save 60 10000  60秒内至少有10000个key被改变则做一次快照

dbfilename  dump.rdb
#rdb持久化存储数据库文件名,默认为dump.rdb

stop-write-on-bgsave-error yes 
#yes代表当使用bgsave命令持久化出错时候停止写RDB快照文件,no则代表继续写

rdbchecksum yes
#开启rdb文件校验

dir "/etc"
#数据文件存放目录,rdb快照文件和aof文件都会存放至该目录


################################# 复制相关配置参数 #################################

slaveof <masterip> <masterport>  
#设置该数据库为其他数据库的从数据库,设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

masterauth <master-password>
#主从复制中,设置连接master服务器的密码(前提master启用了认证)

slave-serve-stale-data yes
# 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
# 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求
# 2) 如果slave-serve-stale-data是指为no,除了INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress"

repl-ping-slave-period 10
#从库会按照一个时间间隔向主库发送PING命令来判断主服务器是否在线,默认是10秒

repl-timeout 60
#设置主库批量数据传输时间或者ping回复时间间隔超时时间,默认值是60秒
# 一定要确保repl-timeout大于repl-ping-slave-period

repl-backlog-size 1mb
#设置复制积压大小,只有当至少有一个从库连入才会释放。

slave-priority 100
#当主库发生宕机时候,哨兵会选择优先级最高的一个称为主库,从库优先级配置默认100,数值越小优先级越高

min-slaves-to-write 3
min-slaves-max-lag 10
#设置某个时间断内,如果从库数量小于该某个值则不允许主机进行写操作,以上参数表示10秒内如果主库的从节点小于3个,则主库不接受写请求,min-slaves-to-write 0代表关闭此功能。


################################## 安全相关配置 ###################################

requirepass
#客户端连接认证的密码,默认为空,即不需要密码,若配置则命令行使用AUTH进行认证

maxclients 10000
# 设置同一时间最大客户端连接数,4.0默认10000,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,
# 如果设置 maxclients 0,表示不作限制。
# 当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

maxmemory 4gb
#设置最大使用的内存大小

maxmemory-policy noeviction
#设置达到最大内存采取的策略:
# volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
# allkeys-lru -> 利用LRU算法移除任何key
# volatile-random -> 移除设置过过期时间的随机key
# allkeys->random -> remove a random key, any key
# volatile-ttl -> 移除即将过期的key(minor TTL)
# 4.0默认noeviction代表不删除任何key,只在写操作时候返回错误。

maxmemory-samples 5
#LRU,LFU等算法样本设置,默认5个key


############################## AOF相关配置###############################

appendonly no
# 设置AOF持久化,yes开启,no禁用,开启后redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重写。

appendfilename "appendonly.aof"
#设置AOF文件名

appendfsync everysec
# AOF文件写策略,Redis支持三种同步AOF文件的策略:
# no: 不进行同步,交给操作系统去执行 ,速度较快
# always: always表示每次有写操作都调用fsync方法强制内核将该写操作写入到文件,速度会慢, 但是安全,因为每次写操作都在AOF文件中.
# everysec: 表示对写操作进行累积,每秒同步一次,折中方案.
# 默认是"everysec",按照速度和安全折中这是最好的。

no-appendfsync-on-rewrite no
# AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作
# 在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理,为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#当AOF文件增长到一定大小的时候Redis能够调用BGREWRITEAOF对日志文件进行重写,它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)。
#基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
# 同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况
# 设置 percentage 为0就关闭这个特性
#auto-aof-rewrite-percentage 代表AOF文件每次重写文件大小(以百分数代表),100表示百分之百,即当文件增加了1倍(100%),则开始重写AOF文件
#auto-aof-rewrite-min-size  设置最小重写文件大小,避免文件小而执行太多次的重写

aof-load-truncated yes
#当redis突然运行崩溃时,会出现aof文件被截断的情况,Redis可以在发生这种情况时退出并加载错误,以下选项控制此行为。
#如果aof-load-truncated设置为yes,则加载截断的AOF文件,Redis服务器启动发出日志以通知用户该事件。
#否则,如果该选项设置为no,则服务器将中止并显示错误并停止启动。当该选项设置为no时,用户需要在重启之前使用“redis-check-aof”实用程序修复AOF文件在进行重启


################################## 慢查询配置 ###################################


slowlog-log-slower-than 10000
 #Redis Slow Log 记录超过特定执行时间的命令。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间,可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微秒,因此1000000代表一分钟
#另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除

slowlog-max-len 128
#慢查询命令记录队列长度设置,该队列占用内存,可以使用SLOWLOG RESET清空队列



############################### 高级配置 ###############################

hash-max-zipmap-entries 512
hash-max-zipmap-value 64
# 当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
# Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,
# 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

list-max-ziplist-size -2
#Lists也以特殊方式编码,以节省大量空间。
#可以指定每个内部列表节点允许的条目数
#作为固定的最大大小或最大元素数。
#对于固定的最大大小,使用-5到-1表示:
#-5:最大大小:64 Kb < - 不建议用于正常工作负载
#-4:最大尺寸:32 Kb < - 不推荐
#-3:最大尺寸:16 Kb < - 可能不推荐
#-2:最大尺寸:8 Kb < - 好
#-1:最大尺寸:4 Kb < - 良好
#正数意味着存储_exactly_元素数量
#每个列表节点。
#性能最高的选项通常为-2(8 Kb大小)或-1(4 Kb大小)

zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# list数据类型多少节点以下会采用去指针的紧凑存储格式。
# list数据类型节点值大小小于多少字节会采用紧凑存储格式。

activerehashing yes
# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用
# 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
# 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
#客户端输出缓冲区限制可用于强制断开客户端,由于某种原因,没有足够快地从服务器读取数据,常见的原因是Pub / Sub客户端不能像很快的消费一条消息,可以为三种不同类型的客户端设置不同的限制:
#normal - >普通客户端,包括MONITOR客户端
#subve - >从服务器客户端
#pubsub - >客户端订阅了至少一个pubsub通道或模式
#设置方法:client-output-buffer-limit 软限制大小 硬限制大小 秒数
#当客户端达到硬限制大小则立即断开连接,当客户端达到软限制时候并且在设置的秒数缓冲大小任然超了,则在设置的秒数后断开连接

退订模式

使用 PUNSUBSCRIBE 命令可以退订指定的模式,
这个命令执行的是订阅模式的反操作: 程序会删除
redisServer.pubsub_patterns 链表中, 所有和被退订模式相关联的
pubsubPattern 结构,
这样客户端就不会再收到和模式相匹配的频道发来的信息。

四、数据类型以及相关操作

通常使用redis不外乎使用其常用的5中数据类型:string、list、hash、set、sorted_set,在3.2版本以后新添加geo经纬度支持,以下将对其类型的常用操作做说明。

小结

订阅信息由服务器进程维持的 redisServer.pubsub_channels
字典保存,字典的键为被订阅的频道,字典的值为订阅频道的所有客户端。
当有新消息发送到频道时,程序遍历频道(键)所对应的(值)所有客户端,然后将消息发送到所有订阅频道的客户端上。
订阅模式的信息由服务器进程维持的 redisServer.pubsub_patterns
链表保存,链表的每个节点都保存着一个 pubsubPattern
结构,结构中保存着被订阅的模式,以及订阅该模式的客户端。程序通过遍历链表来查找某个频道是否和某个模式匹配。
当有新消息发送到频道时,除了订阅频道的客户端会收到消息之外,所有订阅了匹配频道的模式的客户端,也同样会收到消息。
退订频道和退订模式分别是订阅频道和订阅模式的反操作。

命令使用前言

通大多数据库一样,redis所有的命令提供了帮助,可以使用help
+命令名称查看其使用方法,帮助信息中不仅有命令用法,还有命令始于版本信息,分组等。

为了友好的使用,redis还将所有命令都进行了分组,同时使用help+@+组名进行查看每个组中所有命令,以下是所有分组信息。

上面以及介绍如何查看命令使用方法,所以在以下数据类型操作时候,只举例常用的命令,更多命令参考https://redis.io/commands

注意:redis在3.2版本新增geo数据类型。

generic       #一般命令组,对大多数类型适用
string        #字符串类型命令组,使用所有字符串类型
list          #列表类型命令组
set           #集合类型命令组
sorted_set    #有序集合命令组
hash          #hash操作命令组
pubsub        #发布命令组
transactions  #事务操作命令组
connection    #连接相关命令组
server        #服务器相关命令组
scripting     #lua 脚本命令组
hyperloglog   #hyperloglog类型命令组,redis在 2.8.9 版本添加了 HyperLogLog 结构
cluster       #集群相关命令组
geo           #经纬度相关命令组,适用于3.2.0以后的版本

示例:查看事务操作所有命令

美高梅59599 14

 

key操作

常用:

DEL key #删除某个key
KEYS pattern  #查看符合正则的所有key
EXISTS key [key ...] #判断某个key是否存在,可支持多个,返回存在的个数
EXPIRE key seconds #刷新某个key过期时间
MOVE key db  #移动key到某个数据库

示例:

美高梅59599 15

string操作

字符串操作中需要注意的是,redis中的整型也当作字符串处理。

常用:

SET key value [EX seconds] [PX milliseconds] [NX|XX]  #设置key为指定的字符串值。
#参数:
#EX seconds – 设置键key的过期时间,单位时秒
#PX milliseconds – 设置键key的过期时间,单位时毫秒
#NX – 只有键key不存在的时候才会设置key的值
#XX – 只有键key存在的时候才会设置key的值

APPEND key value  #如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。

GET key #获取key值,不存在则返回nil

GETRANGE key start end #获取指定key值的索引开始位置和结束位置所对应的值,索引从0开始

GETSET key value  #设置新的key值,并获取设置之前的值,如果key不存在则设置,并返回nil

MGET key [key ...]   #批量获取key的值

MSET key value [key value ...] #批量设置key的值

DECR key #数字类型的key自减操作,key类型不是数字则报错

INCR key  #数字类型key 自加操作,与DECR相反

DECRBY key decrement  #数字类型key指定减少数值

INCRBY key increment   #数字类型key指定增加数值,与DECRBY相反

STRLEN key  #获取key长度

示例:

美高梅59599 16

list操作

列表中的元素索引从0开始,倒数的元素可以用“-”+倒数位置表示,如-2,代表倒数第二个元素,-1则代表最后一个元素。

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边。

一个列表最多可以包含 232 – 1 个元素 (4294967295,
每个列表超过40亿个元素)。

常用:

LPUSH key value [value ...]  #从列表左边放入一个或者多个元素

LPUSHX key value  #当列表存在时,从左边放入一个元素

RPUSH key value [value ...]  #从列表右边放入一个或者多个元素

RPUSHX key value  #当列表存在时,从右边放入一个元素

LSET key index value  #根据索引设置列表中元素的值,当list不存在是报错

LINDEX key index  #根据列表索引获取元素值,索引从0开始

LINSERT key BEFORE|AFTER pivot value  #在列表中,基于某个基准点插入值,pivot代表基准点

LLEN key #获取列表长度

LRANGE key start stop  #根据索引获取列表中的元素,列表索引最后一个可以使用-1

LREM key count value  #从存于 key 的列表里移除前 count 次出现的值为 value 的元素
#count > 0: 从头往尾移除值为 value 的元素
#count < 0: 从尾往头移除值为 value 的元素
#count = 0: 移除所有值为 value 的元素

LPOP key  #从列表左边删除一个元素

RPOP key  #从列表右边删除一个元素

RPOPLPUSH source destination  #删除source列表中的删除最后一个元素将其追加到destination列表

LTRIM key start stop  #根据索引start和stop保留列表元素

示例:

美高梅59599 17

admin

网站地图xml地图