柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

Redis数据类型及常用操作

一、Redis键(Key)

#http://doc.redisfans.com/key/index.html   #关于key的所有指令

1.1 查看key

#http://doc.redisfans.com/key/keys.html   #关于KEYS命令的常用操作及举例

> KEYS *   #KEYS *,匹配数据库中所有 key 。

> KEYS k*  #匹配所有以k开头的key

> KEYS k?y*  #匹配所有“k中间是一个任意字符y"开头的key

> KEYS k[1|ey]* #匹配所有k1开头或者key开头的key

#特殊符号用 \ 隔开

> EXISTS k1  #查看k1键是否存在,存在返回(integer) 1,不存在返回(integer) 0。

> RANDOMKEY  #从当前数据库中随机的返回一个key,数据库不为空就返回一个key,如果数据库为空就返回nil。

> TYPE k2 #返回k2所储存的值得类型,none (key不存在)string (字符串)list (列表)set (集合)zset (有序集)hash (哈希表)

> SORT num_01  #对num_01里面的值(列表里面要是整数)进行排序,是升序。

> SORT num_01 DES  #对num_01进行降序排序。

1.2 删除移动key

> DEL k3  #删除一个名字叫做k3的key,key存在就返回(integer) 1,删除的key不存在就返回(integer) 0。

> DEL k2 k3 k4 #同时删除k2,k3,k4,同时删除多个key,key之间用空格隔开。因为我们上面已经删除了k3,所以如果K2和k4存在的话应该返回(integer) 2

> MOVE k1 1 #将k1从当前的库移到1号库,如果当前的库没有k1,则返回(integer) 0。当1号库也存在k1的时候,操作也是失败的。

1.3 给key设置过期时间

> EXPIRE cache_page 30  #给一个叫cache_page的key设置过期时间为30秒。
> TTL cache_page  #查看cache_page这个key还剩多少秒过期。如果还没过期显示正数,过期了显示-2.

> EXPIRE cache_page 3000 #如果上面的cache_page还没过期呢,再执行一次新的过期设置会替代旧的过期设置。如果已经过期了,运行这句话就失效了。要重新set 定义这个叫做cache_page的key,过期时间设置才能生效。

> EXPIREAT cache_page 1499616000  #这里是指定cache_page的过期时间是2017年7月10号。EXPIREAT指定的是unix时间戳。
> PEXPIRE cache_page 150000  #设置了cache_page的过期时间是150000毫秒。

> PTTL cache_page  #查看精确到毫秒,还有多久过期。
> PERSIST cache_page  #移除cache_page的过期时间,让其永不过期。用TTL查看返回的是-1,就表示永不过期。

1.4 修改key的名称

> RENAME cache_page pages  #将cache_page改名为pages,如果cache_pages不存在则提示(error) ERR no such key。如果要替换成的新key已经存在则替换掉。

> RENAMENX  K1 k2  #当k2这个key不存在的时候,K1才能将名称更换成k2。

博文来自:www.51niux.com

二、String(字符串)

参考:http://doc.redisfans.com/string/index.html

2.1 设置key值

> set user chaishao  #设置一个key的名称为user,键值为chaishao.如果user键已经存在就会覆盖其值。

> set user shaoye NX #只有键user不存在的时候才会进行设置操作(NX的作用。)等同于SETNX key value.

> set user shaoye XX #只有键user存在的时候才会进行设置操作。

> set user shaoye EX 30  #设置user键的过期时间为30秒,效果等同于SETEX key second value.

> set user shaoye PX 30000  #设置名称为user的键的过期时间为30000毫秒。效果等同于PSETEX key millisecond value.
> set user2 shaoye EX 300 NX  #EX和NX还可以混合使用
> MSET date "2017.06.20" time "21:42 am"  #可以设置多个值,设置了date键值为“2017.06.20”time键值为"21:42 am"

> MSETNx date "2017.06.20" time "21:44 am"   #添加的键都不存在才会设置成功,MSETNX 是原子性的。

> GETSET date "2017.06.21” #给指定的key设置value,并显示key的旧值。这种键不存在则设置失败。

> APPEND user2 "-110” #如果user2不存在,user2的值就是-110,如果user2存在,就是原来的尾部追加上-110。

> SETRANGE empty_string 5 "Redis!"  #用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。如果empty_string不存在所得到的结果就是:"\x00\x00\x00\x00\x00Redis!" #不足的空位用\x00填充。如果键值存在切长度构成,就会从第五个位置开始替换为Redis!,如"2017.Redis!"

2.2 获取key值

> get date   #获取date键的值
"2017.06.20"
> MGET date time  #获取多个键值

1) "2017.06.21"
2) "21:42 am"

> STRLEN date  #返回key所存储的字符串值得长度,如果键不存在则返回0.

> GETRANGE date 0 3  #取一个键值得范围,这里是0-3,也就是0、1、2、3,负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。 0 -1 # 从第一个到最后一个, -1 -5 # 不支持回绕操作显示为"",值域范围不超过实际字符串,超过部分自动被忽略。

"2017"

2.3 对值是数字的键做操作

> INCR keynum  #如果key值不存在,那么key的值会先被初始化为0然后再执行INCR操作。如果存在就将key中储存的数字值加1。

> INCRBY keynum 20 #当keynum不存在的时候就是先初始化为0然后加20,如果存在就是在值得基础上加20.

> INCRBYFLOAT keynum 20.22 #为key所存储的值加上浮点数,当然也可以是整数, INCRBYFLOAT 的计算结果也最多只能表示小数点的后十七位。

> DECRBY keynum 20  #为keymum所存储的数字减20。这个存储的数字必须是整数。
> DECR keynum   #每次为keynum所存储的数字减1,这个存储的数字必须是整数。

三、List(列表)

#http://doc.redisfans.com/list/index.html

3.1 列表的添加

> RPUSH mylist1 a b c  #将一个或多个值 value 插入到列表 key 的表尾(最右边)。当 key 存在但不是列表类型时,返回一个错误。

> RPUSHX mylist1 1  #将单个值value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。当 key 不存在时, RPUSHX 命令什么也不做。

> LPUSH mylist1 0 1 2  #将一个或多个值value插入到列表key的表头(最左边)。当 key 存在但不是列表类型时,返回一个错误。

> LPUSHX mylist1 0  #将单个值value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。当 key 不存在时, LPUSHX 命令什么也不做。

> LINSERT mylist1 BEFORE "a" "hello"  #在mylist1列表的a值前面加入hello字段。当指定的匹配值不存在于列表 key 时,不执行任何操作。当 key 不存在时, key 被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。

> LINSERT mylist1 AFTER "a" "buhao" #在mylist1列表的a值后面加入buhao字段。如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到指定的匹配值,返回 -1 。如果 key 不存在或为空列表,返回 0 。

> LSET mylist1 4 "nidaye"  #将mylist1的索引下表是4的值设置为"nidaye"。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。

3.2 列表的查看

> LINDEX mylist1 4  #返回mylist1列表中下表是4的元素。不能指定范围,只能制定单一下标。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如果 key 不是列表类型,返回一个错误。

"nidaye"
> LLEN mylist1 #返回mylist1列表的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0 .如果 key 不是列表类型,返回一个错误。

> LRANGE mylist1 0 -1  #显示一个列表指定区间内容的元素,这里区间以偏移量0(start)和-1(stop)指定。

3.3 删除列表里面的内容

> LPOP mylist1 #返回并删除mylist1列表key的头元素。

> RPOP mylist1  #返回并删除mylist1列表key的尾元素。

#RPOPLPUSH source destination  #source列表的尾部跑到destination列表的头部。#http://doc.redisfans.com/list/rpoplpush.html

> BRPOPLPUSH mylist mylist1 99994  #把mylist里面的索引下标99994的元素弹出来调到mylist1的头部。

> BRPOP mylist1 #将mylist1列表尾部的元素弹出并删除。

> BLPOP mylist1 #将mylist1列表头部的元素弹出并删除。

> RPOP mylist1 #将mylist1列表尾部的元素返回并删除。

> LPOP mylist1 #将mylist1列表头部的元素返回并删除。

> LREM mylist1 2 b #移除mylist1表里面从头到尾,前两个b。 0 b就表示移除所有的b。-1 b 就表示从尾向头第一个b。

> LTRIM mylist1 2 5  #保留下标2到5之间的元素。让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。当 key 不是列表类型时,返回一个错误。0 -1列表将被清空。

博文来自:www.51niux.com

四、set(集合)

4.1 向集合添加元素

> SADD bbs "tianxia"  "buda"  "baidu"  #将一个或多个member元素写入到集合key中,如果member元素存在将被忽略。

4.2 集合的数量

> SCARD bbs  #如果集合里面有内容就返回member元素的个数,如果集合不存在或里面是空的返回0.

> SINTER bbs  #返回集合里面的内容

> SINTER bbs blog  #但是有多个key就不一样了,现在集合的交集

> SMEMBERS bbs #返回集合中的所有成员,不存在的key被视为空集合。

> SDIFF bbs blog  #这个就是先求出bbs和blog的交集,然后返回bbs里面除交集内容以外的元素,谁在前谁是被匹配的那个key。

图片.png

> SDIFFSTORE bbs_diff_blog bbs blog  #这就是将SDIFF的结果存放在指定的一个key里面,如果里面有内容就会被覆盖。这里存放到了bbs_diif_blog

图片.png

> SINTERSTORE bbs_and_blog bbs blog  #这就是将bbs和blog两个集合的交集存入到bbs_and_blog中,如果里面存在值则替换。

> SISMEMBER bbs "sina" #判断"sina"是否是bbs的元素,是就返回1,不是就返回0。

> SRANDMEMBER bbs   #返回bbs集合中的一个随机元素。

> SUNION bbs blog #返回bbs和blog集合的并集也就是返回他们两个集合中的所有元素。

> SUNIONSTORE bbs_or_blog bbs blog #将bbs和blog集合的并集存放到bbs_or_blog集合中。

#注意上面提到的并集、差集、交集,都支持多个集合。

4.3 操作集合中的元素

> SMOVE bbs blog "sohu" #将bbs中的"sohu"元素移动到blog集合中。如果"sohu"元素存在就返回1,如果不存在或者bbs集合不存在就返回0.

> SPOP bbs  #随机返回并删除bbs集合中的一个元素

> SREM bbs "buda" "baidu"  #移除bbs集合中指定的元素,不存在的元素会被忽略,如果移除成功下面会显示移除的个数。

五、Hash

hash就是KV模式不变,但V是一个键值对。

5.1 创建一个hash

> HSET website baidu "www.baidu.com"  #创建一个叫做website的哈希表key。中的域baidu的值是www.baidu.com.还可以设置其他域。

> HMSET website sina "www.sina.com"  yahoo "www.yahoo.com"  #同时设置多个field-value(域-值),域存在就会被覆盖。成功返回OK。
> HSETNX website sina "www.sina.cn"  #将website哈希key中的sina的值设置为www.sina.com,如果域存在则操作无效,只有域不存在的时候才有效。

5.2 查看hash表

> HEXISTS website sina.cn  #查看website哈希表key中,是否存在sina.cn域,如果存在返回1,不存在返回0.

> HGET website sina.cn  #返回哈希表key中sina.cn域的值。

> HGETALL website  #返回哈希表key中所有的域和域的值,域在上值在下。

> HKEYS website  #返回哈希表中所有的域

> HVALS website   #返回哈希表中所有域的值。

> HLEN website  #返回website哈希表key中域的数量。

6.3 删除hash表key中的域

> HDEL website goole  #删除website哈希表key中的goole域,可以删除多个域,多个域之间用空格隔开。

6.4 hash表key中设置增量

> HINCRBY website pagenum 200  #首先pagenum得值要是个整数不然执行报错,如果pagenum域不存在,这里就是添加pagenum域并为其赋值200.如果pagenum域的值已经存在,则这里就是原来的值加200.

图片.png

> HINCRBY website pagenum -50  #当然也可以指定负数,那400-50就是350.

> HINCRBYFLOAT website pagenum 4.5  #这就是浮点数的增量

六、Zset有序集合(SortedSet)

#http://doc.redisfans.com/sorted_set/index.html

6.1 创建一个有序集合

> ZADD page_rank 8 bing.cn  #8是score的值,score值可以是整数值或双精度浮点数。后面的bing.cn是集合的member。

> ZADD page_rank 9 baidu.com 8 bing.com  #可以添加多个score和member。如果member已经存在但是score值不同则会覆盖掉旧的score

6.2 查看Zset集合

> ZCARD page_rank   #返回page_rank序集key的基数。

> ZCOUNT page_rank 0 8  #返回page_rank中score值在0(min)到8(max)的成员数量。

> ZRANGE page_rank 0 -1  #返回指定区间内的成员,这里是所有。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

> ZRANGE page_rank 0 1 WITHSCORES  #可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,不然只返回member。

> ZREVRANGE page_rank 0 -1 WITHSCORES  #ZREVRANGE是让score值递减(从大到小)来排序。

#ZRANGEBYSCORE    #所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。

#ZREVRANGEBYSCORE  #这个也是区间,跟上面不同的是是递减。

> ZRANK page_rank bing.cn  #这里是显示bing.cn的排名。排名以0为底,也就是说score 值最小的成员排名为 0 。其中有序集成员按 score 值递增(从小到大)顺序排列。

> ZREVRANK page_rank bing.cn  #正好是递减,上面排位最低的在这里是排名最高的。
> ZSCORE page_rank bing.cn  #返回bing.cn元素的score值。

6.3 Zset值增量

> ZINCRBY salary 2000 tom #格式是ZINCRBY key increment member。这是定义了一个工资的集合,然后为tom的键增加了一个2000的值。也可以是负数值。score 值可以是整数值或双精度浮点数。

6.4 Zset删除成员

> ZREM page_rank baidu.com bing.com  #可以删除一个或多个成员之间用空格隔开,元素不存在返回0,删除了几个就返回几个数。

> ZREMRANGEBYRANK page_rank 0 1  #移除有序集key中指定排名区间内的所有成员,这里是删除0-1之间的成员,0表示第一个成员。

> ZREMRANGEBYSCORE page_rank 2 4  #移除page_rank有序集中,score值之间大于并等于2小于并等于4的成员。

6.5 Zset有序集的交集和并集

下面两个参数在线文档说的比较详细:

#ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] #并集

#ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]  #交集

博文来自:www.51niux.com

七、INFO信息查看

文档链接:http://doc.redisfans.com/server/info.html


127.0.0.1:6379> info

# Server  #一般Redis服务器信息,包含以下域
redis_version:3.2.9                                     #redis服务器版本
redis_git_sha1:00000000                           #git SHA1
redis_git_dirty:0                                          #git dirty flag
redis_build_id:981e5dd19fd02099            #redis的build_id
redis_mode:standalone                             #redis的运行模式,这里是单机不是集群(cluster)
os:Linux 2.6.32-358.el6.x86_64 x86_64        #redis服务器的宿主机操作系统
arch_bits:64                                                   #架构(32位还是64位)
multiplexing_api:epoll                              #Redis 所使用的事件处理机制

gcc_version:4.4.7                                         #gcc版本
process_id:2753                                           #redis服务器的进程ID
run_id:08b8effd5d82c8c99edef99259f282aa76dba5a1  #Redis 服务器的随机标识符(用于 Sentinel 和集群)

tcp_port:6379                                                #tcp/ip监听端口
uptime_in_seconds:15                                   #子redis服务器启动以来,经过的秒数
uptime_in_days:0                                          #自redis启动以来经过的天数
hz:10                                                              #redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次

lru_clock:5314336                                        #自增的时钟,用于LRU管理,该时钟100ms(hz=10,因此每1000ms/10=100ms执行一次定时任务)更新一次.

executable:/root/redis-server                    
config_file:

# Clients  #已连接客户端信息,包含以下域
connected_clients:1                                       #已连接客户端的数量(不包括通过从属服务器连接的客户端)
client_longest_output_list:0                           #当前连接客户端当中,最长的输出列表,用client list命令观察omem字段最大值client_biggest_input_buf:0                             #当前连接客户端当中,最大的输入缓存.用client list命令观察qbuf和qbuf-free两个字段最大值blocked_clients:0                                            #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
# Memory    #内存信息,包含以下域
used_memory:1330504                                   #由 Redis 分配器分配的内存总量,以字节(byte)为单位

used_memory_human:1.27M                         #以人类可读的格式返回 Redis 分配的内存总量

used_memory_rss:5955584                           #从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)这个值和 top、ps 等命令的输出一致used_memory_rss_human:5.68M                  #这个就是把上面的的字节转换成MB
used_memory_peak:1330504                       #Redis 的内存消耗峰值(以字节为单位)

used_memory_peak_human:1.27M             #以人类可读的格式返回redis内存消耗的峰值

total_system_memory:1036849152             #操作系统本身的内存大小
total_system_memory_human:988.82M      #操作系统内存大小转换成可读的方式
used_memory_lua:37888                              #Lua 引擎所使用的内存大小(以字节为单位)

used_memory_lua_human:37.00K                #将上面转换成可读的方式
maxmemory:0                                                #redis使用内存的上限,这里是没有设置。一般是要设置的。
maxmemory_human:0B                                 #上面的字节转换成可读的形式
maxmemory_policy:noeviction                     #内存不足时候的清除策略。
mem_fragmentation_ratio:4.48        #used_memory_rss和used_memory之间的比率,小于1表示使用了swap,大于1表示碎片比较多mem_allocator:jemalloc-4.0.3           #在编译时指定的redis所使用的内存分配器。可以是libc、jemalloc或者tcmalloc

# Persistence   #持久化的相关信息
loading:0                                            #服务器是否正在载入持久化文件
rdb_changes_since_last_save:0          #距离最近的一次持久化,有多少个个写入命令没有持久化
rdb_bgsave_in_progress:0                  #服务器是否正在创建rdb文件
rdb_last_save_time:1498486545         #离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件rdb_last_bgsave_status:ok                  #最近一次持久化是否成功
rdb_last_bgsave_time_sec:-1              #最近一次生成rdb文件的秒数
rdb_current_bgsave_time_sec:-1        #如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数

aof_enabled:0                                     #是否开启了aof,这里0是未开启

aof_rewrite_in_progress:0                    #标识aof的rewrite操作是否在进行中

aof_rewrite_scheduled:0                      #rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite 。
aof_last_rewrite_time_sec:-1                 #最近一次aof rewrite耗费的时长

aof_current_rewrite_time_sec:-1           #如果rewrite操作正在进行,则记录所使用的时间,单位秒

aof_last_bgrewrite_status:ok                #上次bgrewrite aof操作的状态

aof_last_write_status:ok                        #最近一次aof的写入状态

# Stats  #一般统计信息
total_connections_received:1               #新创建的连接个数
total_commands_processed:1              #redis处理的命令个数
instantaneous_ops_per_sec:0               #redis当前的qps,redis内部较实时的每秒执行的命令数。
total_net_input_bytes:31                       #redis网络入口流量字节数
total_net_output_bytes:6035691           #redis网络出口流量字节数
instantaneous_input_kbps:0.00             #redis网络入口kps
instantaneous_output_kbps:0.00           #redis网络出口kps
rejected_connections:0                           #拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数

sync_full:0                                                #主从完全同步成功次数

sync_partial_ok:0                                      #主从部分同步成功次数

sync_partial_err:0                                     #主从部分同步失败次数

expired_keys:0                                          #运行以来过期的key的数量

evicted_keys:0                                          #运行以来剔除(超过了maxmemory后)的key的数量

keyspace_hits:0                                        #命中次数

keyspace_misses:0                                    #没命中次数

pubsub_channels:0                                  #当前使用中的频道数量

pubsub_patterns:0                                   #当前使用的模式的数量

latest_fork_usec:0                                     #最近一次fork操作阻塞redis进程的耗时数,单位微秒

migrate_cached_sockets:0

# Replication   #主从信息,这里是master上显示的信息
role:master                                                #实例的角色
connected_slaves:0                                   #连接的slave实例个数
master_repl_offset:0                                  #主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟

repl_backlog_active:0                                #复制积压缓冲区是否开启

repl_backlog_size:1048576                        #复制积压缓冲大小

repl_backlog_first_byte_offset:0                 #复制缓冲区里偏移量的大小

repl_backlog_histlen:0                                #此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小
# CPU        #CPU计算量统计信息
used_cpu_sys:0.17                                       #Redis服务器耗费的系统 CPU。                 
used_cpu_user:0.17                                     #Redis服务器耗费的用户CPU 。

used_cpu_sys_children:0.00                        #后台进程耗费的系统 CPU。

used_cpu_user_children:0.00                      #后台进程耗费的用户 CPU。

# Cluster
cluster_enabled:0                                       #一个标志值,记录集群功能是否已经开启。

# Keyspace                                                 #keyspace 部分记录了数据库相关的统计信息,比如数据库的键数量、数据库已经被删除的过期键数量等。db0:keys=23,expires=0,avg_ttl=0
db1:keys=3,expires=0,avg_ttl=0

更多redis的常用操作命令:http://doc.redisfans.com/server/index.html


作者:忙碌的柴少 分类:Redis 浏览:1828 评论:0
留言列表
发表评论
来宾的头像