redis使用指南
<a href="https://s2.51cto.com/wyfs02/M02/9B/FD/wKioL1lqAoHxyo01AAA3XHbm_lI768.png" target="_blank"></a>
一、Redis简介
redis展开来看就是remote directory server。redis是开源的,基于内存的数据结构存储,可以作为数据库,缓存系统或者消息队列。它支持数据结构有字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps(位图)、hyperloglogs、空间索引,十分的强大。redis有内建的复制功能,支持lua脚本,LRU算法,事务,持久存储并且支持高可用(sentinel,redis cluster)。以下是redis的特点总结:
<a href="https://s1.51cto.com/wyfs02/M01/9B/FE/wKiom1lqAx3AG8aVAABNiEDKB7I613.png" target="_blank"></a>
二、Redis安装
由于redis功能十分的强大,应用十分的广泛,目前已经被收录到了epel仓库,因此我们只需要将yum仓库指向epel仓库即可。因此这里安装十分的简单,直接yum install -y redis。注意我这里安装的是redis3.2版本,目前官方最新版本为redis4。下载安装方式十分简单。如有想法,请戳网址
https://redis.io/download
三、配置文件详解
通常rpm安装的软件包,我们可以通过如下命令查看程序相关的配置文件
<code>[root@mysql ~]</code><code># rpm -ql redis</code>
<code>/etc/logrotate</code><code>.d</code><code>/redis</code>
<code>/etc/redis-sentinel</code><code>.conf </code><code>#监控(哨兵)配置文件</code>
<code>/etc/redis</code><code>.conf </code><code>#主配置文件</code>
<code>/etc/systemd/system/redis-sentinel</code><code>.service.d</code>
<code>/etc/systemd/system/redis-sentinel</code><code>.service.d</code><code>/limit</code><code>.conf</code>
<code>/etc/systemd/system/redis</code><code>.service.d</code>
<code>/etc/systemd/system/redis</code><code>.service.d</code><code>/limit</code><code>.conf</code>
<code>/usr/bin/redis-benchmark</code>
<code>/usr/bin/redis-check-aof</code>
<code>/usr/bin/redis-check-rdb</code>
<code>/usr/bin/redis-cli</code> <code>#redis客户端程序</code>
<code>/usr/bin/redis-sentinel</code>
<code>/usr/bin/redis-server</code> <code>#redis服务端程序</code>
<code>/usr/bin/redis-shutdown</code>
<code>/usr/lib/systemd/system/redis-sentinel</code><code>.service</code>
<code>/usr/lib/systemd/system/redis</code><code>.service</code>
<code>/usr/lib/tmpfiles</code><code>.d</code><code>/redis</code><code>.conf</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/00-RELEASENOTES</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/BUGS</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/CONTRIBUTING</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/MANIFESTO</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/README</code><code>.md</code>
<code>/usr/share/licenses/redis-3</code><code>.2.3</code>
<code>/usr/share/licenses/redis-3</code><code>.2.3</code><code>/COPYING</code>
<code>/var/lib/redis</code>
<code>/var/log/redis</code> <code>#redis日志文件目录</code>
<code>/var/run/redis</code>
<code>[root@mysql ~]</code><code># grep '^##' /etc/redis.conf </code>
<code>################################## INCLUDES ###################################</code>
<code>################################## NETWORK #####################################</code>
<code>################################# GENERAL #####################################</code>
<code>################################ SNAPSHOTTING ################################</code>
<code>################################# REPLICATION #################################</code>
<code>################################## SECURITY ###################################</code>
<code>################################### LIMITS ####################################</code>
<code>############################## APPEND ONLY MODE ###############################</code>
<code>################################ LUA SCRIPTING ###############################</code>
<code>################################ REDIS CLUSTER ###############################</code>
<code>################################## SLOW LOG ###################################</code>
<code>################################ LATENCY MONITOR ##############################</code>
<code>############################# EVENT NOTIFICATION ##############################</code>
<code>############################### ADVANCED CONFIG ###############################</code>
grep以下可以查看redis主配置文件有哪些配置段。
使用以下命令还可以查看主配置文件中已经开启了哪些服务。
<code>[root@mysql2 ~]</code><code># cat /etc/redis.conf | grep -v '#' | sed '/^$/d' </code>
<code>bind 0.0.0.0</code>
<code>protected-mode no</code>
<code>port 6379</code>
<code>tcp-backlog 511</code>
<code>timeout 0</code>
<code>tcp-keepalive 300</code>
<code>daemonize no</code>
<code>supervised no</code>
<code>pidfile </code><code>/var/run/redis/redis</code><code>.pid</code>
<code>loglevel notice</code>
<code>logfile </code><code>/var/log/redis/redis</code><code>.log</code>
<code>databases 16</code>
<code>save 900 1</code>
<code>save 300 10</code>
<code>save 60 10000</code>
<code>stop-writes-on-bgsave-error </code><code>yes</code>
<code>rdbcompression </code><code>yes</code>
<code>rdbchecksum </code><code>yes</code>
<code>dbfilename dump.rdb</code>
<code>dir</code> <code>/var/lib/redis</code>
<code>slave-serve-stale-data </code><code>yes</code>
<code>slave-</code><code>read</code><code>-only </code><code>yes</code>
<code>repl-diskless-</code><code>sync</code> <code>no</code>
<code>repl-diskless-</code><code>sync</code><code>-delay 5</code>
<code>repl-disable-tcp-nodelay no</code>
<code>slave-priority 100</code>
<code>appendonly no</code>
<code>appendfilename </code><code>"appendonly.aof"</code>
<code>appendfsync everysec</code>
<code>no-appendfsync-on-rewrite no</code>
<code>auto-aof-rewrite-percentage 100</code>
<code>auto-aof-rewrite-min-size 64mb</code>
<code>aof-load-truncated </code><code>yes</code>
<code>lua-</code><code>time</code><code>-limit 5000</code>
<code> </code><code>cluster-enabled </code><code>yes</code>
<code> </code><code>cluster-config-</code><code>file</code> <code>nodes-6379.conf</code>
<code> </code><code>cluster-node-timeout 15000</code>
<code>slowlog-log-slower-than 10000</code>
<code>slowlog-max-len 128</code>
<code>latency-monitor-threshold 0</code>
<code>notify-keyspace-events </code><code>""</code>
<code>hash</code><code>-max-ziplist-entries 512</code>
<code>hash</code><code>-max-ziplist-value 64</code>
<code>list-max-ziplist-size -2</code>
<code>list-compress-depth 0</code>
<code>set</code><code>-max-intset-entries 512</code>
<code>zset-max-ziplist-entries 128</code>
<code>zset-max-ziplist-value 64</code>
<code>hll-sparse-max-bytes 3000</code>
<code>activerehashing </code><code>yes</code>
<code>client-output-buffer-limit normal 0 0 0</code>
<code>client-output-buffer-limit slave 256mb 64mb 60</code>
<code>client-output-buffer-limit pubsub 32mb 8mb 60</code>
<code>hz 10</code>
<code>aof-rewrite-incremental-fsync </code><code>yes</code>
接下来分析主配置文件/etc/redis.conf各个配置段的内容
3.1、INCLUDES配置段
如果你有更好的配置模板,请放在这个配置段
<code># include /path/to/local.conf</code>
<code># include /path/to/other.conf</code>
3.2、网络配置段
网络配置项:
<code>bind 127.0.0.1</code>
<code>#允许连接redis的客户端IP</code>
<code>#安全模式</code>
<code>#端口</code>
<code>#后援队列</code>
<code>#客户端闲置时,关闭客户端连接的超时时长,0表示不关闭</code>
<code>#长连接超时时长</code>
3.3、通用配置段
<code>############################### GENERAL #####################################</code>
<code>#默认情况下redis不以守护进程的模式运行</code>
<code>#是否开启超级监管 </code>
<code>pid文件路径</code>
<code>#日志级别</code>
<code> </code>
<code>#指定日志文件路径</code>
<code>#设定数据库的数量</code>
3.4、快照配置段
RDB(将内存中的数据刷写到磁盘),RDB对内存做快照,不停地快照导出数据,缺点:容易丢失数据
<code>save 900 1 </code>
<code>#900秒有一个键值改变做一次快照</code>
<code>#300秒有10个键值改变做一次快照</code>
<code>save 60 10000 </code>
<code>#60秒有10000键值改变就做一次快照</code>
<code>#默认情况下,如果在RDB snapshots持久化过程中出现问题,设置该参数后,Redis是不允许用户进行任何更新操作</code>
<code>#在导出.RDB数据库文件的时候采用LZF压缩字符串和对象。想节省一些CPU资源可以设置为no,但数据量可能会很大。</code>
<code>#RDB快照制作过程中会在文件的末尾写入crc64的校验值。这样可能很好的保证数据的正确性。</code>
<code>代价是导致性能下降</code>
<code>#快照文件名</code>
<code>dir</code> <code>./</code>
<code>#快照路径</code>
3.5、主从配置相关段
主从配置相关的配置项,一个Master可以有多个slave主机,支持链式复制;Master以非阻塞方式同步数据至slave主机。
<code>slaveof <masterip> <masterport></code>
<code>#用于创建从服务器</code>
<code># masterauth <master-password></code>
<code>#主服务器认证密码</code>
<code>#当slave丢失与master端的连接,或者复制仍在处理,那么slave会有下列两种表现:</code>
<code> </code><code>yes</code><code>表示,slave继续响应客户端的请求,尽管数据已经不同了。</code>
<code> </code><code>no表示slave会返回</code><code>"SYNC with master in progreee"</code><code>的错误信息;</code>
<code>#从服务器只读</code>
<code>repl-diskless-</code><code>sync</code> <code>no </code>
<code>新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:</code>
<code> </code><code>Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;</code>
<code> </code><code>Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;</code>
<code> </code>
<code>#基于网络套接字同步延迟时长</code>
<code>repl-</code><code>ping</code><code>-slave-period 10</code>
<code>#ping从服务器的时间间隔</code>
<code># repl-timeout 60</code>
<code>#主从复制超时时长</code>
<code>#默认为no,当选择yes的时候, master会向slave发送少量的tcp packets,这样的一个负面影响 delay slave接受数据时间,40 milliseconds 的延迟,在 高流量或者 master slave之间中间节点数很多的情况下,建议变为 yes</code>
<code># repl-backlog-size 1mb</code>
<code>#后援队了的最大内存</code>
<code># repl-backlog-ttl 3600</code>
<code>#后援队列的ttl时长</code>
<code>#当master服务挂了后,优先级越低的slave,越有可能成为master候选人</code>
<code># min-slaves-to-write 3 </code>
<code>#最少从节点在线时,主节点允许写数据</code>
<code># min-slaves-max-lag 10 </code>
<code>#从节点最多落后主节点多长时间</code>
<code># slave-announce-ip 5.5.5.5 </code>
<code>#对外宣称服务器的IP</code>
<code># slave-announce-port 1234 </code>
<code>#对外宣称服务器的端口</code>
3.6、安全相关配置段
<code>#安全相关的</code>
<code># requirepass foobared</code>
<code>#是否设置密码,requirepass +密码</code>
<code>#rename-command CONFIG ""</code>
<code>#重命名或禁用某些命令</code>
3.7、limit配置段
<code># maxclients 10000</code>
<code>#客户端并发数量</code>
<code># maxmemory <bytes></code>
<code>#内存限制,过期会删除key</code>
<code> </code><code>最大并发连接数</code>
<code># maxmemory <bytes> </code>
<code>最大可提供内存</code>
<code># maxmemory-policy noeviction</code>
<code> </code><code>内存淘汰策略</code>
<code># volatile-lru -> remove the key with an expire set using an LRU algorithm </code>
<code> </code><code>基于LRU算法将过期时间的键做淘汰</code>
<code># allkeys-lru -> remove any key according to the LRU algorithm</code>
<code> </code><code>基于LRU算法将所有键淘汰 </code>
<code># volatile-random -> remove a random key with an expire set </code>
<code> </code><code>随机淘汰</code>
<code># allkeys-random -> remove a random key, any key</code>
<code> </code><code>对所有键做随机淘汰</code>
<code># volatile-ttl -> remove the key with the nearest expire time (minor TTL)</code>
<code> </code><code>基于TTL时长淘汰</code>
<code># noeviction -> don't expire at all, just return an error on write operations </code>
<code> </code><code>从不淘汰,一旦内存耗尽,报错</code>
<code>默认是:</code><code># maxmemory-policy noeviction</code>
<code>推荐volatile-lru,volatile-ttl </code>
<code>如何判断内存的淘汰?-->定量采样</code>
<code> </code><code># maxmemory-samples 5</code>
3.8、AOF模式配置段
AOF,即 APPEND ONLY MODE,意思仅追加文件。rdis内存中的数据默认是异步同步到磁盘的,如果发生宕机,会造成一些数据的丢失。AOF也是数据持久化的一种方式,可以提高数据的可靠性。AOF模式会记录每次写操作至指定的文件尾部实现存储持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库。默认使用fsync() 刷写磁盘数据,发生断电,或者Redis出现内部错误的时候最多丢失1秒数据。AOF和RDB这两种持久化方式可以同时开启不会发生冲突,开始AOF模式的话,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件。每次启动时Redis都会把这个文件的数据读入内存里。
<code>#是否记录持久化日志</code>
<code>#AOF 文件</code>
<code>#每秒写一次</code>
<code>#fsync() 请求操作系统马上把数据写到磁盘上</code>
<code>redis支持以下三种模式</code>
<code> </code><code>no:redis不执行主动同步操作,而是OS进行;</code>
<code> </code><code>everysec:每秒一次;</code>
<code> </code><code>always:每语句一次,慢,但是安全;</code>
<code> </code>
<code>#是否在后台执行aof重写期间不调用fsync,默认为no,表示调用;</code>
<code>#上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB就会重写AOF; </code>
<code># redis在启动的时候可以加载被截断的AOF文件,默认启用;否则可能启动失败</code>
<code>注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;</code>
3.9、LUA脚本配置段
<code>#lua脚本执行时间限制</code>
3.10、redis集群配置段
<code>cluster-enabled </code><code>yes</code>
<code>#是否开启集群</code>
<code>cluster-config-</code><code>file</code> <code>nodes-6379.conf</code>
<code>#集群配置文件</code>
<code>cluster-node-timeout 15000</code>
<code>#集群节点通信超时时长</code>
3.11、慢启动日志配置段
慢启动日志用于记录超过指定时间的查询,但需要注意的是:运行时间不包括各种I/O时间。
例如:连接客户端,发送响应数据等。
<code>#慢查询日志长度,这个长度没有限制,单位为微妙,只要有足够的内存就行可以通过 SLOWLOG RESET 来释放内存</code>
3.12、延迟监控配置段
3.13、事件通知配置段
3.14、redis高级配置段
配置redis的高级选项
<code>#每一个对应的hash能存储的最大entries</code>
<code>#每一个对应的hash能存储的最大value</code>
<code>#当有大量数据时,适合用哈希编码但需要更多的内存,元素数量上限不能超过给定限制。</code>
<code>list-max-ziplist-entries 512</code>
<code>list-max-ziplist-value 64</code>
<code>#与哈希相类似,list数据元素较少的情况下,可以用另一种方式来编码从而节省大量空间。</code>
<code>#set 编码形式为是64位无符号整型数字构成的字符串。该参数来限制这种情况下使用这种编码的最大上限的。</code>
<code>#和 hashes,lists 相似,为了节约空间 sorted sets 也使用特殊的编码方式。这种编码只适合长度和元素都符合上面限制的有序序列。</code>
<code>#当子进程重写AOF文件,以下选项开启时,AOF文件会每产生32M数据同步一次,这有利于避免写入磁盘延迟。</code>
四、redis用法简介
4.1、redis命令选项
使用redis-cli -h命令可以查看redis客户端命令的用法。选项用法其实很简单,搞定英语应该不在话下。
<code>[root@mysql ~]</code><code># redis-cli -h</code>
<code>redis-cli 3.2.3</code>
<code>Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]</code>
<code> </code><code>-h <</code><code>hostname</code><code>> Server </code><code>hostname</code> <code>(default: 127.0.0.1). </code>
<code> </code><code>-p <port> Server port (default: 6379).</code>
<code> </code><code>-s <socket> Server socket (overrides </code><code>hostname</code> <code>and port).</code>
<code> </code><code>-a <password> Password to use when connecting to the server.</code>
<code> </code><code>-r <repeat> Execute specified </code><code>command</code> <code>N </code><code>times</code><code>.</code>
<code> </code><code>-i <interval> When -r is used, waits <interval> seconds per </code><code>command</code><code>.</code>
<code> </code><code>It is possible to specify sub-second </code><code>times</code> <code>like -i 0.1.</code>
<code> </code><code>-n <db> Database number.</code>
<code> </code><code>-x Read last argument from STDIN.</code>
<code> </code><code>-d <delimiter> Multi-bulk delimiter </code><code>in</code> <code>for</code> <code>raw formatting (default: \n).</code>
<code> </code><code>-c Enable cluster mode (follow -ASK and -MOVED redirections).</code>
<code> </code><code>--raw Use raw formatting </code><code>for</code> <code>replies (default when STDOUT is</code>
<code> </code><code>not a </code><code>tty</code><code>).</code>
<code> </code><code>--no-raw Force formatted output even when STDOUT is not a </code><code>tty</code><code>.</code>
<code> </code><code>--csv Output </code><code>in</code> <code>CSV </code><code>format</code><code>.</code>
<code> </code><code>--stat Print rolling stats about server: mem, clients, ...</code>
<code> </code><code>--latency Enter a special mode continuously sampling latency.</code>
<code> </code><code>--latency-</code><code>history</code> <code>Like --latency but tracking latency changes over </code><code>time</code><code>.</code>
<code> </code><code>Default </code><code>time</code> <code>interval is 15 sec. Change it using -i.</code>
<code> </code><code>--latency-dist Shows latency as a spectrum, requires xterm 256 colors.</code>
<code> </code><code>Default </code><code>time</code> <code>interval is 1 sec. Change it using -i.</code>
<code> </code><code>--lru-</code><code>test</code> <code><keys> Simulate a cache workload with an 80-20 distribution.</code>
<code> </code><code>--slave Simulate a slave showing commands received from the master.</code>
<code> </code><code>--rdb <filename> Transfer an RDB dump from remote server to </code><code>local</code> <code>file</code><code>.</code>
<code> </code><code>--pipe Transfer raw Redis protocol from stdin to server.</code>
<code> </code><code>--pipe-timeout <n> In --pipe mode, abort with error </code><code>if</code> <code>after sending all data.</code>
<code> </code><code>no reply is received within <n> seconds.</code>
<code> </code><code>Default timeout: 30. Use 0 to wait forever.</code>
<code> </code><code>--bigkeys Sample Redis keys looking </code><code>for</code> <code>big keys.</code>
<code> </code><code>--scan List all keys using the SCAN </code><code>command</code><code>.</code>
<code> </code><code>--pattern <pat> Useful with --scan to specify a SCAN pattern.</code>
<code> </code><code>--intrinsic-latency <sec> Run a </code><code>test</code> <code>to measure intrinsic system latency.</code>
<code> </code><code>The </code><code>test</code> <code>will run </code><code>for</code> <code>the specified amount of seconds.</code>
<code> </code><code>--</code><code>eval</code> <code><</code><code>file</code><code>> Send an EVAL </code><code>command</code> <code>using the Lua script at <</code><code>file</code><code>>.</code>
<code> </code><code>--ldb Used with --</code><code>eval</code> <code>enable</code> <code>the Redis Lua debugger.</code>
<code> </code><code>--ldb-</code><code>sync</code><code>-mode Like --ldb but uses the synchronous Lua debugger, </code><code>in</code>
<code> </code><code>this mode the server is blocked and script changes are</code>
<code> </code><code>are not rolled back from the server memory.</code>
<code> </code><code>--help Output this help and </code><code>exit</code><code>.</code>
<code> </code><code>--version Output version and </code><code>exit</code><code>.</code>
<code> </code><code>Examples:</code>
<code> </code><code>cat</code> <code>/etc/passwd</code> <code>| redis-cli -x </code><code>set</code> <code>mypasswd</code>
<code> </code><code>redis-cli get mypasswd</code>
<code> </code><code>redis-cli -r 100 lpush mylist x</code>
<code> </code><code>redis-cli -r 100 -i 1 info | </code><code>grep</code> <code>used_memory_human:</code>
<code> </code><code>redis-cli --</code><code>eval</code> <code>myscript.lua key1 key2 , arg1 arg2 arg3</code>
<code> </code><code>redis-cli --scan --pattern </code><code>'*:12345*'</code>
一些简单命令的操作
连接redis服务端
<code>[root@mysql ~]</code><code># redis-cli </code>
<code>127.0.0.1:6379></code>
选择第1数据库
<code>127.0.0.1:6379> </code><code>select</code> <code>1 </code>
<code>OK</code>
选择第15个数据库
<code>127.0.0.1:6379[1]> </code><code>select</code> <code>15 </code>
<code>127.0.0.1:6379[15]></code>
选择第17个库,报错,redis默认16个库
<code>127.0.0.1:6379[15]> </code><code>select</code> <code>17</code>
<code>(error) ERR invalid DB index</code>
选择默认库
<code>127.0.0.1:6379[15]> </code><code>select</code> <code>0 </code>
使用帮助,查看transaction的使用,当然你按下tab键就可以查看其他的命令的使用
<code>127.0.0.1:6379> help @transactions</code>
<code> </code><code>DISCARD -</code>
<code> </code><code>summary: Discard all commands issued after MULTI</code>
<code> </code><code>since: 2.0.0</code>
<code> </code><code>EXEC -</code>
<code> </code><code>summary: Execute all commands issued after MULTI</code>
<code> </code><code>since: 1.2.0</code>
<code> </code><code>MULTI -</code>
<code> </code><code>summary: Mark the start of a transaction block</code>
<code> </code><code>UNWATCH -</code>
<code> </code><code>summary: Forget about all watched keys</code>
<code> </code><code>since: 2.2.0</code>
<code> </code><code>WATCH key [key ...]</code>
<code> </code><code>summary: Watch the given keys to determine execution of the MULTI</code><code>/EXEC</code> <code>block</code>
按下tab可切换查看不同的选项
<code>127.0.0.1:6379> help @</code>
输入命令时会自动提示输入后面的内容,相当的方便
<code>127.0.0.1:6379> </code><code>set</code> <code>key value [EX seconds] [PX milliseconds] [NX|XX]</code>
4.2、redis数据类型
1.string 字符串
redis String是最常用的一种数据类型,普通的key/value存储都可以归为此类;
<code>foo->bar 键值关系</code>
<code>#查看string字符串相关操作命令</code>
<code>help @string </code>
<code>#设置键值</code>
<code>127.0.0.1:6379> SET testkey </code><code>'tom'</code>
<code>#获取键值</code>
<code>127.0.0.1:6379> get testkey</code>
<code>"tom"</code>
<code>#追加键值,往后补值</code>
<code>127.0.0.1:6379> append testkey </code><code>' neo'</code>
<code>(integer) 9</code>
<code>#删除键</code>
<code>127.0.0.1:6379> del testkey</code>
<code>(integer) 1</code>
<code>#获取键</code>
<code>(nil)</code>
<code>#设定多个键值</code>
<code>127.0.0.1:6379> mset name </code><code>'tom'</code> <code>age 12</code>
<code>#获取多个键值</code>
<code>127.0.0.1:6379> mget name age</code>
<code>1) </code><code>"tom"</code>
<code>2) </code><code>"12"</code>
<code>#设置数值1</code>
<code>27.0.0.1:6379> </code><code>set</code> <code>counts 1 </code>
<code>#获取数值</code>
<code>127.0.0.1:6379> get counts </code>
<code>"1"</code>
<code>#减一操作</code>
<code>127.0.0.1:6379> decr counts</code>
<code>(integer) 0</code>
<code>127.0.0.1:6379> get counts</code>
<code>"0"</code>
<code>#加一操作</code>
<code>127.0.0.1:6379> incr counts</code>
<code>(integer) 2</code>
<code>"2"</code>
2.list 列表
redis list 类型其实就是每个子元素都是 string 类型的双向链表,这就意味着即使你有成千上万中元素在list中,添加一个新元素到list开头或者结尾的操作算法时间复杂度都是O(1)。
<code>#查看list列表相关操作命令</code>
<code>help @list</code>
<code>l:left</code>
<code>r:right</code>
<code>#在列表中追加一个值</code>
<code>127.0.0.1:6379> lpush mylist </code><code>'monday'</code>
<code>#按索引查看列表中的元素,查看[0]号元素,即第一个元素</code>
<code>127.0.0.1:6379> lindex mylist 0</code>
<code>"monday"</code>
<code>127.0.0.1:6379> lpush mylist </code><code>'sunday'</code>
<code>#按索引查看列表中的元素</code>
<code>"sunday"</code>
<code>#按索引查看列表中的元素,查看第二个元素</code>
<code>127.0.0.1:6379> lindex mylist 1</code>
<code>#从列表右边追加一个值</code>
<code>127.0.0.1:6379> rpush mylist </code><code>'tuesday'</code>
<code>(integer) 3</code>
<code>127.0.0.1:6379> lindex mylist 2</code>
<code>"tuesday"</code>
<code>#从列表右边删除一个值</code>
<code>127.0.0.1:6379> rpop mylist</code>
<code>"Tuesday"</code>
<code>127.0.0.1:6379> lindex mylist 2 </code>
<code>#获取列表的长度</code>
<code>127.0.0.1:6379> llen mylist</code>
<code>127.0.0.1:6379> lpop mylist</code>
3. hash
redis hash是一个string类型的field和value的映射表.
<code>#查看hash类型相关操作命令</code>
<code>help @</code><code>hash</code>
<code>#设定hash键值为stu1,字段id,值为1</code>
<code>127.0.0.1:6379> hset stu1 </code><code>id</code> <code>1 </code>
<code>#设定另一个hash数据</code>
<code>127.0.0.1:6379> hset stu1 name </code><code>'tom'</code>
<code>127.0.0.1:6379> hset stu1 age 12</code>
<code>#获取hash字段中所有的值</code>
<code>127.0.0.1:6379> hmget stu1 </code><code>id</code> <code>name age </code>
<code>1) </code><code>"1"</code>
<code>2) </code><code>"tom"</code>
<code>3) </code><code>"12"</code>
<code>#获取hash中所有的值</code>
<code>127.0.0.1:6379> hvals stu1</code>
<code>#获取hash中所有的字段</code>
<code>127.0.0.1:6379> hkeys stu1</code>
<code>1) </code><code>"id"</code>
<code>2) </code><code>"name"</code>
<code>3) </code><code>"age"</code>
<code>#获取hash中所有字段及对应的值</code>
<code>127.0.0.1:6379> hgetall stu1</code>
<code>2) </code><code>"1"</code>
<code>3) </code><code>"name"</code>
<code>4) </code><code>"tom"</code>
<code>5) </code><code>"age"</code>
<code>6) </code><code>"12"</code>
4 set 集合
redis的set是string类型的无序集合。
<code>#查看set数据类型相关的操作命令</code>
<code>127.0.0.1:6379> help @</code><code>set</code>
<code>#在students集合中添加多个成员</code>
<code>127.0.0.1:6379> sadd students </code><code>'tom'</code> <code>'jerry'</code> <code>'lili'</code>
<code>#在teachers集合中添加多个成员</code>
<code>127.0.0.1:6379> sadd teachers </code><code>'sam'</code> <code>'jerry'</code>
<code>#将 students集合中的‘lili’移到teachers集合</code>
<code>127.0.0.1:6379> smove students teachers </code><code>'lili'</code>
<code>#获取集合中所有的成员</code>
<code>127.0.0.1:6379> smembers students</code>
<code>2) </code><code>"jerry"</code>
<code>127.0.0.1:6379> smembers teachers</code>
<code>1) </code><code>"lili"</code>
<code>2) </code><code>"sam"</code>
<code>3) </code><code>"jerry"</code>
<code>#获取两个集合的交集</code>
<code>127.0.0.1:6379> sinter students teachers </code>
<code>1) </code><code>"jerry"</code>
<code>#获取两个集合的并集</code>
<code>127.0.0.1:6379> sunion students teachers</code>
<code>3) </code><code>"sam"</code>
<code>4) </code><code>"jerry"</code>
<code>#students集合中有那些成员teachers集合不存在</code>
<code>127.0.0.1:6379> </code><code>sdiff</code> <code>students teachers </code>
<code>#和上面相反</code>
<code>127.0.0.1:6379> </code><code>sdiff</code> <code>teachers students</code>
<code>#随机删除集合中的一个成员</code>
<code>127.0.0.1:6379> spop students 1 </code>
<code>#删除一个成员</code>
<code>127.0.0.1:6379> srem students </code><code>'tom'</code>
5 sorted set 有序集合
redis的sorted set是string类型的有序集合。
<code>#获取有序集合数据类型相关的操作命令用法</code>
<code>127.0.0.1:6379> help @sorted_set</code>
<code>#有序添加stus集合的成员</code>
<code>127.0.0.1:6379> zadd stus 1 </code><code>'tom'</code> <code>2 </code><code>'jerry'</code> <code>3 </code><code>'lucy'</code>
<code>#有序添加teas集合的成员</code>
<code>127.0.0.1:6379> zadd teas 1 </code><code>'sam'</code> <code>2 </code><code>'jerry'</code> <code>3 </code><code>'lili'</code>
<code>#获取有序集合成员的个数</code>
<code>127.0.0.1:6379> zcard teas</code>
<code>#同上</code>
<code>127.0.0.1:6379> ZCARD stus</code>
<code> </code><code>#获取索引</code>
<code>127.0.0.1:6379> zrank teas jerry </code>
<code>#通过索引获取值</code>
<code>127.0.0.1:6379> zrange stus 1 2 </code>
<code>2) </code><code>"lucy"</code>
<code>#通过分数获取有序集合中的对应的值</code>
<code>127.0.0.1:6379> ZRANGEBYSCORE stus 1 2 </code>
<code>#添加一个有序集合</code>
<code>127.0.0.1:6379> ZADD ecscores 67 </code><code>'tom'</code> <code>33 </code><code>'lili'</code> <code>89 </code><code>'michael'</code> <code>55 </code><code>'sam'</code>
<code>(integer) 4</code>
<code>127.0.0.1:6379> ZRANGEBYSCORE ecscores 44 90</code>
<code>1) </code><code>"sam"</code>
<code>3) </code><code>"michael"</code>
4.3、redis客户端/服务端命令使用
client端命令
<code>#获取客户端名字,默认为空</code>
<code>127.0.0.1:6379> CLIENT GETNAME </code>
<code>#设置客户端名字</code>
<code>127.0.0.1:6379> CLIENT SETNAME </code><code>'mysql'</code>
<code>127.0.0.1:6379> CLIENT GETNAME</code>
<code>"mysql"</code>
<code>#列出客户端</code>
<code>127.0.0.1:6379> CLIENT list </code>
<code>id</code><code>=6 addr=127.0.0.1:55374 fd=5 name= age=1619 idle=1619 flags=N db=0 sub=0 psub=0 multi</code>
<code>id</code><code>=7 addr=127.0.0.1:55376 fd=6 name=mysql age=579 idle=0 flags=N db=0 sub=0 psub=0 mul</code>
<code>#暂停客户端</code>
<code>127.0.0.1:6379> CLIENT PAUSE</code>
<code>#杀死客户端</code>
<code>127.0.0.1:6379> CLIENT KILL</code>
<code>#客户端是否响应</code>
<code>127.0.0.1:6379> CLIENT REPLY</code>
server端命令
<code>#获取服务端详实信息,info命令很重要,几乎可以查看各种各样的详尽的信息</code>
<code>127.0.0.1:6379> info </code>
<code># Server 服务端信息</code>
<code>redis_version:3.2.3</code>
<code>redis_git_sha1:00000000</code>
<code>redis_git_dirty:0</code>
<code>redis_build_id:672aed6eb816ad6c</code>
<code>redis_mode:standalone</code>
<code>os:Linux 3.10.0-514.el7.x86_64 x86_64</code>
<code>arch_bits:64</code>
<code>multiplexing_api:epoll</code>
<code>gcc_version:4.8.5</code>
<code>process_id:9087</code>
<code>run_id:4788b467cdf1f8055eca00ef6bbe57b55ef20bde</code>
<code>tcp_port:6379</code>
<code>uptime_in_seconds:12596</code>
<code>uptime_in_days:0</code>
<code>hz:10</code>
<code>lru_clock:6928199</code>
<code>executable:</code><code>/usr/bin/redis-server</code>
<code>config_</code>
<code># Clients 客户端信息 </code>
<code>connected_clients:2</code>
<code>client_longest_output_list:0</code>
<code>client_biggest_input_buf:0</code>
<code>blocked_clients:0</code>
<code># Memory 内存信息</code>
<code>used_memory:834424</code>
<code>used_memory_human:814.87K</code>
<code>used_memory_rss:6094848</code>
<code>used_memory_rss_human:5.81M</code>
<code>used_memory_peak:834424</code>
<code>used_memory_peak_human:814.87K</code>
<code>total_system_memory:1023938560 </code><code>#总共内存</code>
<code>total_system_memory_human:976.50M</code>
<code>used_memory_lua:37888</code>
<code>used_memory_lua_human:37.00K</code>
<code>maxmemory:0 </code><code>#内存无限制</code>
<code>maxmemory_human:0B</code>
<code>maxmemory_policy:noeviction</code>
<code>mem_fragmentation_ratio:7.30</code>
<code>mem_allocator:jemalloc-3.6.0</code>
<code># Persistence 持久化相关信息 </code>
<code>loading:0</code>
<code>rdb_changes_since_last_save:0</code>
<code>rdb_bgsave_in_progress:0</code>
<code>rdb_last_save_time:1500090506</code>
<code>rdb_last_bgsave_status:ok</code>
<code>rdb_last_bgsave_time_sec:0</code>
<code>rdb_current_bgsave_time_sec:-1</code>
<code>aof_enabled:0</code>
<code>aof_rewrite_in_progress:0</code>
<code>aof_rewrite_scheduled:0</code>
<code>aof_last_rewrite_time_sec:-1</code>
<code>aof_current_rewrite_time_sec:-1</code>
<code>aof_last_bgrewrite_status:ok</code>
<code>aof_last_write_status:ok</code>
<code># Stats 统计数据信息,很重要 </code>
<code>total_connections_received:6 </code>
<code>total_commands_processed:82</code>
<code>instantaneous_ops_per_sec:0</code>
<code>total_net_input_bytes:3065</code>
<code>total_net_output_bytes:35815120</code>
<code>instantaneous_input_kbps:0.00</code>
<code>instantaneous_output_kbps:0.00</code>
<code>rejected_connections:0</code>
<code>sync_full:0</code>
<code>sync_partial_ok:0</code>
<code>sync_partial_err:0</code>
<code>expired_keys:0</code>
<code>evicted_keys:0</code>
<code>keyspace_hits:42</code>
<code>keyspace_misses:1</code>
<code>pubsub_channels:0</code>
<code>pubsub_patterns:0</code>
<code>latest_fork_usec:852</code>
<code>migrate_cached_sockets:0</code>
<code># Replication #主从复制相关信息</code>
<code>role:master</code>
<code>connected_slaves:0</code>
<code>master_repl_offset:0</code>
<code>repl_backlog_active:0</code>
<code>repl_backlog_size:1048576</code>
<code>repl_backlog_first_byte_offset:0</code>
<code>repl_backlog_histlen:0</code>
<code># CPU相关 </code>
<code>used_cpu_sys:8.24 内核空间</code>
<code>used_cpu_user:4.10 用户空间</code>
<code>used_cpu_sys_children:0.01</code>
<code>used_cpu_user_children:0.00</code>
<code># Cluster信息</code>
<code>cluster_enabled:0</code>
<code># Keyspace </code>
<code>db0:keys=10,expires=0,avg_ttl=0 键 过期时长 ttl</code>
<code>127.0.0.1:6379> info memory</code>
<code>#单独显示CPU信息</code>
<code>127.0.0.1:6379> info CPU</code>
<code># CPU</code>
<code>used_cpu_sys:8.56</code>
<code>used_cpu_user:4.16</code>
<code>used_cpu_user_children:0.0</code>
<code>#关机命令</code>
<code>127.0.0.1:6379> SHUTDOWN [NOSAVE|SAVE]</code>
<code>#confi命令 配置服务器属性</code>
<code>127.0.0.1:6379> CONFIG SET</code>
<code>127.0.0.1:6379> CONFIG GET </code>
<code>127.0.0.1:6379> CONFIG REWRITE </code>
<code>127.0.0.1:6379> CONFIG RESETSTAT</code>
redis的使用暂且先介绍到这里,下次我们再介绍redis的应用。
本文转自 PowerMichael 51CTO博客,原文链接:http://blog.51cto.com/huwho/1947925,如需转载请自行联系原作者