redis 列表list 与集合 set的区别
list 可以有重复的数据
set的数值都是唯一的
reids-server.exe redis.window.conf
2、链接redis客户端
redis-cli.exe -h 127.0.0.1 -p 6379
3、redis 键key命令
set key_name key_value 建key 并赋值
del key_name 删除存在的key
dump key_name 如果 key 不存在,那么返回 nil 。 否则,返回序列化之后的值。
EXISTS KEY_NAME EXISTS 命令用于检查给定 key 是否存在。 若 key 存在返回 1 ,否则返回 0 。
Expire KEY_NAME TIME_IN_SECONDS Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。设置成功返回 1 。 当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。
EXPIREAT key_name EXPIREAT 跟expire一样只不过 其接受的是unix的时间戳
pexpire key_name misllsecends 设置毫秒级的过期时间
pexpireat kye_name 在unix上设置毫秒级的过期时间 unix时间戳
Keys 命令用于查找所有符合给定模式 pattern 的 key 。。 符合给定模式的 key 列表 (Array)。 类似于模糊查询 keys后可跟 正则表达式的
redis 127.0.0.1:6379> KEYS w3c*
1) "w3c3"
2) "w3c1"
3) "w3c2"
move key db 将当前数据库的 key 移动到给定的数据库 db 当中。 移动成功返回 1 ,失败则返回 0 。
redis> SELECT 0 # 使用数据库0
OK
redis> SET favorite_fruit "banana"
OK
redis> SELECT 1 # 使用数据库1
OK
redis:1> SET favorite_fruit "apple"
OK
redis:1> SELECT 0 # 使用数据库0,并试图将 favorite_fruit 移动到数据库 1
OK
redis> MOVE favorite_fruit 1 # 因为两个数据库有相同的 key,MOVE 失败
(integer) 0
redis> GET favorite_fruit # 数据库 0 的 favorite_fruit 没变
"banana"
redis> SELECT 1
OK
redis:1> GET favorite_fruit # 数据库 1 的 favorite_fruit 也是
"apple"
persist 移除指定Key的过期时间 1成功 0 失败
pttl key 以毫秒为单位获取key的剩余过期时间
ttl 以秒为单位返回key的剩余生存时间
randomkey 从当前数据库随机返回一个key
rename key newkey 修改key的名称
renamenx key newkey 当key不存在的时候修改key为newkey
type 返回key的类型
4、redis 字符串命令
set key value 设置key值
get key
getrange start end 获取字符串的子 字符串
getset key value 将给定的key设置为value 并返回旧的的value
getbit key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
mget key1 key2 获取 一个或者多个可以的值(空格隔开)
setbit key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
setex key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
setnx key value 只有当key不存在时设置 key的值。
SETRANGE KEY_NAME OFFSET VALUE Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。 被修改后的字符串长度。
redis 127.0.0.1:6379> SET key1 "Hello World"
OK
redis 127.0.0.1:6379> SETRANGE key1 6 "Redis"
(integer) 11
redis 127.0.0.1:6379> GET key1
"Hello Redis"
strlen key 返回key所存储的字符串的长度
mset key value key value 。。。。同时设置多个键值对
msetnx key value key1 value 当key不存在时 同时设置一个或者多个键值对
PSETEX key milliseconds value
incr Incr 命令将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。
INCRBY key increment将 key 所储存的值加上给定的增量值(increment) 。
INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) 。
DECR key 将 key 中储存的数字值减一。
DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。
APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
5、Redis 哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
redis 127.0.0.1:6379> HGETALL w3ckey
"name"
"redis tutorial"
"description"
"redis basic commands for caching"
"likes"
"20"
"visitors"
"23000"
HDEL KEY_NAME FIELD1.. FIELDN 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略
hexists key filed 查看hash表key中指定的字段是否存在
hgetall key 获取hash表key所有字段和值
hincrby key field incrment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
hkeys key 获取所有hash表中的字段
hlen key 获取hash表中的字段
hmget key field1 field2 获取 所有给定字段的值
hmset key field1 value1 field2 value2 同时将多个key-value设置到hash表key中
hset key field value 将hash表key的字段field的值设置为value
hsetnx key field value 只有在字段 field 不存在时,设置哈希表字段的值。
hvals key 获取hash表key的所有值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
6、redis列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
lpush key value1 value2 value3 ...将一个或者多个值插入到列表的头部
lpushx key value1 value2 将一个或者多个值插入到已存在的列表的头部
lrange key start stop 获取列表指定范围内的元素
blpop key1 key2 ... timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BLPOP LIST1 LIST2 .. LISTN TIMEOUT
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
brpop key1 key2 ....timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpoplpush source destination timeiout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
lindex key index 通过索引获取列表中的元素
LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
llen key 获取列表key的长度
lpop 移除并获取列表的第一个元素
lrem key count value 移除列表元素 Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
lset key index value 通过索引设置value
ltrim key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
rpop key 移除并获取列表的最后一个元素
RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
rpushx 为已经存在的列表添加元素
7、redis 集合(set)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
sadd key number1 number2 ... 向集合中添加一个或者多个成员
scard key 获取集合的成员
sdiff key1 key2 key3 返回给定集合的差集
sdiffstore destination key1 key2 key3 返回给定集合的差集并存储在destination中
sinter key1 key2 返回给定集合的交集
sinterstore destination key1 key2 key3 返回指定集合的交集并存储在destination中
sismember key number 判断number元素是否是集合key的成员
smembers key 返回集合中的所有成员
smove source destination member 将member元素从source集合移到destination集合
spop key 移除并返回集合中的随机元素
srandmember key count 返回集合中一个或者多的随机数
srem key member1 member2 。。。移除集合中一个或者多个成员
sunion key1 key2 返回所有给定集合的元素
sunionstore destination key1 key2 返回给定集合的并集并存储在destination中
SSCAN KEY [MATCH pattern] [COUNT count] Sscan命令用于迭代集合键中的元素。
8、redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
redis 127.0.0.1:6379> ZADD w3ckey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD w3ckey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
zadd key score1 member1 score2 member2 ... 向有序集合中添加一个或者多个成员,或者更新已存在成员的分数
zcard key 获取有序集合 的成员数
zcount key min max 计算在有序集合中指定区间分数的成员数
zincrby key increment member 有序集合中指定成员的分数上增加increment
zinterstore destination numkeys key1 key2 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
zlexcount key min max 在有序集合指定区间内计算成员的数量
zrange key start stop withscores 通过索引区间返回有序集合指定区间的成员数
ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c
"a"
"b"
"c"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c
"a"
"b"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
"b"
"c"
"d"
"e"
"f"
redis>
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
zrank key member 返回有序集合中指定成员的索引
zrem key member1 member2 .... 移除有序集合成员的一个或者多个
zremrangebylex key min max 移除有序集合中给定区间的所有成员
zremrangebyrank key statr stop 移除有序结合中给定排名区间的所有成员
zremrangebyscore key min max 移除有序集合中给定分数区间的所有成员
zrevrange key start stop withscores 返回有序集合中给定的分数区间的成员,通过索引 分数由高到低排列
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member 返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
9、redis hyperloglog
redis hyperloglog 是用做基数统计的算法,herloglog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的,并且是很小的。
在redis里面,每个hyperloglog键只需要花费12kb内存,就可以计算接近2^64个不同的元素的基数,这和计算基数时。元素越多耗费内存就越多的集合形式鲜明对比
但是hyperloglog只会根据输入的元素来计算基数,而不会存储输入元素本身,所以hyperloglog不能像集合那样返回输入的元素。
什么是基数:
比如数据集(1、3、5、7、9、7、8、9),那么这个数据集为(1、3、5、7、8、9)的基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。
示例:
redis 127.0.0.1:6379> PFADD w3ckey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD w3ckey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD w3ckey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT w3ckey
(integer) 3
hyperloglog 命令
pfadd key element1 element2 。。。 添加指定元素到hyperloglog 中
pfcount key1 key2 返回给定hyperloglog 的基数估算值
pfmerge destkey sourcekey 将多个hyperloglog 合并为一个hyperloglog
10、redis 发布订阅
11、redis事务
redis 事务可以一次执行多个命令,并且带有一下两个重要的保证:
事务是一个独立的隔离操作:事务中的所有命令都会序列化、按顺序地执行 。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行的会经历一下三个阶段:
开始事务
命令入队
执行事务
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
事务命令
discard 取消事务
exec 执行所有事务块
multi 标记一个事务块的开始
unwatch 取消watch命令对所有key的监视
watch key1 key12 、、、、、 监视一个或者多个key ,如果在事务执行之前这个key被其他命令所改动,那么事务将被打断。
12、redis脚本
redis 脚本使用lua解释器来执行脚本。redis2.6版本通过内嵌执行lua环境。执行脚本的常用命令为eval
eval 命令基本语法:
redis 127.0.0.1:6379>eval script numkeys key [....]
script :参数是一段lua5.1脚本程序。脚本不必定义为一个lua函数
numkeys:用于指定健名参数的个数。
key[key..]:从eval的第三个参数开始算起,表示脚本中所用到的那些redis键,这些键名参数可以在lua中通过全局变量keys数组,用1为基址的形式
arg{arg。。}附加参数,在lua中通过全局变量argv数组访问,访问的形式和keys变量类似(argv1 。。。)
实例
eval "return {keys[1],keys[2]}" 2 key1 key2 first second
1)"key1"
13、redis 链接
redis链接命令主要用于链接redis服务
auth password 验证密码是否正确
echo message 打印字符串
ping 查看服务是否运行
quit 关闭当前连接
select index 切换到指定的数据库
14、数据的备份与恢复
save 命令用于创建当前数据库的备份
该命令在redis安装目录中创建dump.rdb
恢复数据
如果需要恢复数据,只需要将备份文件(dump.rdb)移动到redis安装目录并启动服务即可。获取redis目录可以使用config命令
redis 127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis/bin"
以上命令config get dir 输出的redis 安装目录为/usr/local/redis/bin
bgsave
创建redis备份文件也可以使用命令bgsave,该命令在后台运行
15、redis安全
我们可以通过redis的配置文件设置密码参数,这样客户端连接到redis服务就需要密码验证,这样可以让你的redis服务更安全。
可以通过如下命令设置密码验证
config get requirepass
requeirepass
默认情况下requirepass参数是空的,这就意味着无需通过密码验证就可以连接到redis服务
可以通过下命令修改参数
config get requirepass “w3cschool.cc”
config get requirepass
requirepass
w3cschool.cc
设置密码后,客户端连接redis服务就需要密码验证,否则无法执行命令
auth 命令基本语法格式如下:
auth password
16、redis 性能测试
redis性能测试是通过同时执行多个命令实现的。
redis性能测试的基本命令如下:
redis-benchmark [option] [option value]
一下实例同时执行10000个请求来检测性能:
redis-benchmark -n 100000
ping inline:141043.72 requests per second
ping_bulk:
redis性能测试工具可选参数
-h 指定服务器主机名
-p 指定服务器端口
-s 指定服务器socket
-c 指定并发连接数
-n 指定请求数
-d 以字节的形式指定set/get值的数据大小
-k 1=keep alive 0 = reconnect
-r set/get/incr 使用随机 key,sadd使用随机值
-p 强制退出redis 仅显示query/sec值
-csv 以csv格式输出
-l 生成循环 永久执行测试
-t 仅运行以逗号分隔的测试命令列表
-i idle模式 仅打开n个idle链接并等待
以下实例我们使用了多个参数来测试 redis 性能:
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
SET: 146198.83 requests per second
LPUSH: 145560.41 requests per second
以上实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。
17 redis客户端连接
redis 通过监听一个tcp端口或者unix socket 的方式来接收来自客户端的链接,当一个链接建立后,redis内部会进行以下一些操作
首先 客户端socket 会被设置为非阻塞模式,因为redis在网络事件处理上采用的是非阻塞多路复用模型
然后为这个socket设置tcp_nodelay属性,禁用nagle算法
然后创建一个可读的文件事件用于监听这个客户端sockect的数据发送
最大连接数
在redis中 最大连接数是被直接硬编码在代码里面的 高版本中这个值是可以配置的
maxclients 默认值是10000,也可以在redis.conf 中对这个值进行修改
config get maxclients
maxclients
10000
以下实例在服务启动时设置最大连接数为100000
redis-server --maxclients 100000
客户端命令
clients 返回链接到redis服务的客户端列表
clients setname 设置当前链接的名称
clients getname 获取通过client setname 命令设置的服务名称
挂起客户端链接 指定挂起的时间以毫秒计。
client kill 关闭客户端连接
18、redis 管道技术
redis是一种基于客户端-服务端模型以及请求响应协议的tcp服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端
redis 管道技术可以在服务端末响应时,客户端可以继续想服务端发送请求,并最终一次性读取所有服务端的相应
19、redis 分区
分区是分隔数据到多个redis实例的处理过程,因此每个实例只保存key的一个子集
分区的优势
通过利用多台计算机内存的和值,允许我们构造更大的数据库。
通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络宽带。
分区的不足
涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例时,你就不能对这两个set执行交集操作
涉及多个key的redis事务不能使用
当使用分区,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件
增加或者删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区,
代理其他系统则不支持这项特性。然而,一种叫做presharding 的技术对此是有帮助的。
分区的类型
redis有两种类型分区。假设4个redis实例r0,、r1、r2、r3,和类似user1、user2这样表示用户的多个key,对既定的key有多种不同的方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到摸个redis服务。
范围分区
最简单的分区方式就是按范围分区,就是映射一定范围的对象到特定的redis实例
比如,id从0到10000的用户会保存到实例r0,id从100001到20000的用户会保存到r1,一次类推
这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各种对象的映射表。通常对redis来书并非最好的方法
哈希分区
另外一种分区方法是 hash分区,这对任何key都适用、一无需是object_name这种形式,像下面描述的一样简单:
用一个hash函数将key转换为一个数字,比如视同crc32 hash函数。对key fooba执行crc32(foobar)会输出类似93024922的整数
对这个整数取摸,将其转化为0-3之间的数字,就可以将这个整个映射到4个redis实例中的一个了,
就是说 key foobar应该被保存到r2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。
list 可以有重复的数据
set的数值都是唯一的
1、启动redis服务
cd redis 进入redis 安装目录reids-server.exe redis.window.conf
2、链接redis客户端
redis-cli.exe -h 127.0.0.1 -p 6379
3、redis 键key命令
set key_name key_value 建key 并赋值
del key_name 删除存在的key
dump key_name 如果 key 不存在,那么返回 nil 。 否则,返回序列化之后的值。
EXISTS KEY_NAME EXISTS 命令用于检查给定 key 是否存在。 若 key 存在返回 1 ,否则返回 0 。
Expire KEY_NAME TIME_IN_SECONDS Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。设置成功返回 1 。 当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。
EXPIREAT key_name EXPIREAT 跟expire一样只不过 其接受的是unix的时间戳
pexpire key_name misllsecends 设置毫秒级的过期时间
pexpireat kye_name 在unix上设置毫秒级的过期时间 unix时间戳
Keys 命令用于查找所有符合给定模式 pattern 的 key 。。 符合给定模式的 key 列表 (Array)。 类似于模糊查询 keys后可跟 正则表达式的
redis 127.0.0.1:6379> KEYS w3c*
1) "w3c3"
2) "w3c1"
3) "w3c2"
move key db 将当前数据库的 key 移动到给定的数据库 db 当中。 移动成功返回 1 ,失败则返回 0 。
redis> SELECT 0 # 使用数据库0
OK
redis> SET favorite_fruit "banana"
OK
redis> SELECT 1 # 使用数据库1
OK
redis:1> SET favorite_fruit "apple"
OK
redis:1> SELECT 0 # 使用数据库0,并试图将 favorite_fruit 移动到数据库 1
OK
redis> MOVE favorite_fruit 1 # 因为两个数据库有相同的 key,MOVE 失败
(integer) 0
redis> GET favorite_fruit # 数据库 0 的 favorite_fruit 没变
"banana"
redis> SELECT 1
OK
redis:1> GET favorite_fruit # 数据库 1 的 favorite_fruit 也是
"apple"
persist 移除指定Key的过期时间 1成功 0 失败
pttl key 以毫秒为单位获取key的剩余过期时间
ttl 以秒为单位返回key的剩余生存时间
randomkey 从当前数据库随机返回一个key
rename key newkey 修改key的名称
renamenx key newkey 当key不存在的时候修改key为newkey
type 返回key的类型
4、redis 字符串命令
set key value 设置key值
get key
getrange start end 获取字符串的子 字符串
getset key value 将给定的key设置为value 并返回旧的的value
getbit key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
mget key1 key2 获取 一个或者多个可以的值(空格隔开)
setbit key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
setex key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
setnx key value 只有当key不存在时设置 key的值。
SETRANGE KEY_NAME OFFSET VALUE Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。 被修改后的字符串长度。
redis 127.0.0.1:6379> SET key1 "Hello World"
OK
redis 127.0.0.1:6379> SETRANGE key1 6 "Redis"
(integer) 11
redis 127.0.0.1:6379> GET key1
"Hello Redis"
strlen key 返回key所存储的字符串的长度
mset key value key value 。。。。同时设置多个键值对
msetnx key value key1 value 当key不存在时 同时设置一个或者多个键值对
PSETEX key milliseconds value
incr Incr 命令将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。
INCRBY key increment将 key 所储存的值加上给定的增量值(increment) 。
INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) 。
DECR key 将 key 中储存的数字值减一。
DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。
APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
5、Redis 哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
redis 127.0.0.1:6379> HGETALL w3ckey
"name"
"redis tutorial"
"description"
"redis basic commands for caching"
"likes"
"20"
"visitors"
"23000"
HDEL KEY_NAME FIELD1.. FIELDN 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略
hexists key filed 查看hash表key中指定的字段是否存在
hgetall key 获取hash表key所有字段和值
hincrby key field incrment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
hkeys key 获取所有hash表中的字段
hlen key 获取hash表中的字段
hmget key field1 field2 获取 所有给定字段的值
hmset key field1 value1 field2 value2 同时将多个key-value设置到hash表key中
hset key field value 将hash表key的字段field的值设置为value
hsetnx key field value 只有在字段 field 不存在时,设置哈希表字段的值。
hvals key 获取hash表key的所有值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
6、redis列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
lpush key value1 value2 value3 ...将一个或者多个值插入到列表的头部
lpushx key value1 value2 将一个或者多个值插入到已存在的列表的头部
lrange key start stop 获取列表指定范围内的元素
blpop key1 key2 ... timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BLPOP LIST1 LIST2 .. LISTN TIMEOUT
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
brpop key1 key2 ....timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpoplpush source destination timeiout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
lindex key index 通过索引获取列表中的元素
LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
llen key 获取列表key的长度
lpop 移除并获取列表的第一个元素
lrem key count value 移除列表元素 Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
lset key index value 通过索引设置value
ltrim key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
rpop key 移除并获取列表的最后一个元素
RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
rpushx 为已经存在的列表添加元素
7、redis 集合(set)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
sadd key number1 number2 ... 向集合中添加一个或者多个成员
scard key 获取集合的成员
sdiff key1 key2 key3 返回给定集合的差集
sdiffstore destination key1 key2 key3 返回给定集合的差集并存储在destination中
sinter key1 key2 返回给定集合的交集
sinterstore destination key1 key2 key3 返回指定集合的交集并存储在destination中
sismember key number 判断number元素是否是集合key的成员
smembers key 返回集合中的所有成员
smove source destination member 将member元素从source集合移到destination集合
spop key 移除并返回集合中的随机元素
srandmember key count 返回集合中一个或者多的随机数
srem key member1 member2 。。。移除集合中一个或者多个成员
sunion key1 key2 返回所有给定集合的元素
sunionstore destination key1 key2 返回给定集合的并集并存储在destination中
SSCAN KEY [MATCH pattern] [COUNT count] Sscan命令用于迭代集合键中的元素。
8、redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
redis 127.0.0.1:6379> ZADD w3ckey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD w3ckey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
zadd key score1 member1 score2 member2 ... 向有序集合中添加一个或者多个成员,或者更新已存在成员的分数
zcard key 获取有序集合 的成员数
zcount key min max 计算在有序集合中指定区间分数的成员数
zincrby key increment member 有序集合中指定成员的分数上增加increment
zinterstore destination numkeys key1 key2 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
zlexcount key min max 在有序集合指定区间内计算成员的数量
zrange key start stop withscores 通过索引区间返回有序集合指定区间的成员数
ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c
"a"
"b"
"c"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c
"a"
"b"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
"b"
"c"
"d"
"e"
"f"
redis>
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
zrank key member 返回有序集合中指定成员的索引
zrem key member1 member2 .... 移除有序集合成员的一个或者多个
zremrangebylex key min max 移除有序集合中给定区间的所有成员
zremrangebyrank key statr stop 移除有序结合中给定排名区间的所有成员
zremrangebyscore key min max 移除有序集合中给定分数区间的所有成员
zrevrange key start stop withscores 返回有序集合中给定的分数区间的成员,通过索引 分数由高到低排列
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member 返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
9、redis hyperloglog
redis hyperloglog 是用做基数统计的算法,herloglog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的,并且是很小的。
在redis里面,每个hyperloglog键只需要花费12kb内存,就可以计算接近2^64个不同的元素的基数,这和计算基数时。元素越多耗费内存就越多的集合形式鲜明对比
但是hyperloglog只会根据输入的元素来计算基数,而不会存储输入元素本身,所以hyperloglog不能像集合那样返回输入的元素。
什么是基数:
比如数据集(1、3、5、7、9、7、8、9),那么这个数据集为(1、3、5、7、8、9)的基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。
示例:
redis 127.0.0.1:6379> PFADD w3ckey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD w3ckey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD w3ckey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT w3ckey
(integer) 3
hyperloglog 命令
pfadd key element1 element2 。。。 添加指定元素到hyperloglog 中
pfcount key1 key2 返回给定hyperloglog 的基数估算值
pfmerge destkey sourcekey 将多个hyperloglog 合并为一个hyperloglog
10、redis 发布订阅
11、redis事务
redis 事务可以一次执行多个命令,并且带有一下两个重要的保证:
事务是一个独立的隔离操作:事务中的所有命令都会序列化、按顺序地执行 。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行的会经历一下三个阶段:
开始事务
命令入队
执行事务
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
事务命令
discard 取消事务
exec 执行所有事务块
multi 标记一个事务块的开始
unwatch 取消watch命令对所有key的监视
watch key1 key12 、、、、、 监视一个或者多个key ,如果在事务执行之前这个key被其他命令所改动,那么事务将被打断。
12、redis脚本
redis 脚本使用lua解释器来执行脚本。redis2.6版本通过内嵌执行lua环境。执行脚本的常用命令为eval
eval 命令基本语法:
redis 127.0.0.1:6379>eval script numkeys key [....]
script :参数是一段lua5.1脚本程序。脚本不必定义为一个lua函数
numkeys:用于指定健名参数的个数。
key[key..]:从eval的第三个参数开始算起,表示脚本中所用到的那些redis键,这些键名参数可以在lua中通过全局变量keys数组,用1为基址的形式
arg{arg。。}附加参数,在lua中通过全局变量argv数组访问,访问的形式和keys变量类似(argv1 。。。)
实例
eval "return {keys[1],keys[2]}" 2 key1 key2 first second
1)"key1"
13、redis 链接
redis链接命令主要用于链接redis服务
auth password 验证密码是否正确
echo message 打印字符串
ping 查看服务是否运行
quit 关闭当前连接
select index 切换到指定的数据库
14、数据的备份与恢复
save 命令用于创建当前数据库的备份
该命令在redis安装目录中创建dump.rdb
恢复数据
如果需要恢复数据,只需要将备份文件(dump.rdb)移动到redis安装目录并启动服务即可。获取redis目录可以使用config命令
redis 127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis/bin"
以上命令config get dir 输出的redis 安装目录为/usr/local/redis/bin
bgsave
创建redis备份文件也可以使用命令bgsave,该命令在后台运行
15、redis安全
我们可以通过redis的配置文件设置密码参数,这样客户端连接到redis服务就需要密码验证,这样可以让你的redis服务更安全。
可以通过如下命令设置密码验证
config get requirepass
requeirepass
默认情况下requirepass参数是空的,这就意味着无需通过密码验证就可以连接到redis服务
可以通过下命令修改参数
config get requirepass “w3cschool.cc”
config get requirepass
requirepass
w3cschool.cc
设置密码后,客户端连接redis服务就需要密码验证,否则无法执行命令
auth 命令基本语法格式如下:
auth password
16、redis 性能测试
redis性能测试是通过同时执行多个命令实现的。
redis性能测试的基本命令如下:
redis-benchmark [option] [option value]
一下实例同时执行10000个请求来检测性能:
redis-benchmark -n 100000
ping inline:141043.72 requests per second
ping_bulk:
redis性能测试工具可选参数
-h 指定服务器主机名
-p 指定服务器端口
-s 指定服务器socket
-c 指定并发连接数
-n 指定请求数
-d 以字节的形式指定set/get值的数据大小
-k 1=keep alive 0 = reconnect
-r set/get/incr 使用随机 key,sadd使用随机值
-p 强制退出redis 仅显示query/sec值
-csv 以csv格式输出
-l 生成循环 永久执行测试
-t 仅运行以逗号分隔的测试命令列表
-i idle模式 仅打开n个idle链接并等待
以下实例我们使用了多个参数来测试 redis 性能:
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
SET: 146198.83 requests per second
LPUSH: 145560.41 requests per second
以上实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。
17 redis客户端连接
redis 通过监听一个tcp端口或者unix socket 的方式来接收来自客户端的链接,当一个链接建立后,redis内部会进行以下一些操作
首先 客户端socket 会被设置为非阻塞模式,因为redis在网络事件处理上采用的是非阻塞多路复用模型
然后为这个socket设置tcp_nodelay属性,禁用nagle算法
然后创建一个可读的文件事件用于监听这个客户端sockect的数据发送
最大连接数
在redis中 最大连接数是被直接硬编码在代码里面的 高版本中这个值是可以配置的
maxclients 默认值是10000,也可以在redis.conf 中对这个值进行修改
config get maxclients
maxclients
10000
以下实例在服务启动时设置最大连接数为100000
redis-server --maxclients 100000
客户端命令
clients 返回链接到redis服务的客户端列表
clients setname 设置当前链接的名称
clients getname 获取通过client setname 命令设置的服务名称
挂起客户端链接 指定挂起的时间以毫秒计。
client kill 关闭客户端连接
18、redis 管道技术
redis是一种基于客户端-服务端模型以及请求响应协议的tcp服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端
redis 管道技术可以在服务端末响应时,客户端可以继续想服务端发送请求,并最终一次性读取所有服务端的相应
19、redis 分区
分区是分隔数据到多个redis实例的处理过程,因此每个实例只保存key的一个子集
分区的优势
通过利用多台计算机内存的和值,允许我们构造更大的数据库。
通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络宽带。
分区的不足
涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例时,你就不能对这两个set执行交集操作
涉及多个key的redis事务不能使用
当使用分区,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件
增加或者删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区,
代理其他系统则不支持这项特性。然而,一种叫做presharding 的技术对此是有帮助的。
分区的类型
redis有两种类型分区。假设4个redis实例r0,、r1、r2、r3,和类似user1、user2这样表示用户的多个key,对既定的key有多种不同的方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到摸个redis服务。
范围分区
最简单的分区方式就是按范围分区,就是映射一定范围的对象到特定的redis实例
比如,id从0到10000的用户会保存到实例r0,id从100001到20000的用户会保存到r1,一次类推
这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各种对象的映射表。通常对redis来书并非最好的方法
哈希分区
另外一种分区方法是 hash分区,这对任何key都适用、一无需是object_name这种形式,像下面描述的一样简单:
用一个hash函数将key转换为一个数字,比如视同crc32 hash函数。对key fooba执行crc32(foobar)会输出类似93024922的整数
对这个整数取摸,将其转化为0-3之间的数字,就可以将这个整个映射到4个redis实例中的一个了,
就是说 key foobar应该被保存到r2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。