赞
踩
之前只是在项目简单使用了Redis(只是充当缓存层实现),对Redis的体系技术没深入了解,最近时间比较充裕,所以再次复习巩固Redis,然后打算写几篇博客记录以及分享所复习的Redis知识。
Redis之所以被广泛应用在缓存领域,则是因为它的优点:
Redis支持String、List、Set、Sorted Set和Hash数据类型,适用于大量的应用场景。
https://blog.csdn.net/weixin_44176169/article/details/104394202
https://blog.csdn.net/weixin_44176169/article/details/105025327
下面列举了一些常见配置,当然还有其他配置信息,可以查看安装目录下的redis.conf。
配置 | 作用 | 默认 |
---|---|---|
port | Redis访问端口,由于Redis是单线程模型,因此单机开多个Redis进程的时候会修改端口 | 6379 |
bind | 如果bind选项为空或0.0.0.0的话,那会接受所有来自于可用网络接口的连接。 | 127.0.0.1 |
timeout | 指定在一个client空闲多少秒之后就关闭它,0表示不管 | 0 |
daemonize | 指定Redis是否以守护进程的方式启动 | no |
logfile | 配置log文件地址,默认打印在命令行终端的窗口上 | “” |
databases | 设置Redis数据库的数量,默认使用0号DB | 16 |
save | 把Redis数据保存到磁盘上,这个是在RDB的时候用的 | save 900 1,save 300 10,save 60 10000 |
dbfilename | dump的文件位置 | dump.rdb |
dir | Redis工作目录 | ./ |
slaveof | 主从复制,使用slaveof让一个节点称为某个节点的副本,这个只需要在副本上配置 | 关闭 |
masterauth | 如果主机使用了requirepass配置进行密码保护,使用这个配置告诉副本连接的时候需要鉴权 | 关闭 |
slave-read-only | 配置Redis的Slave实例是否接受写操作,即Slave是否为只读Redis | yes |
requirepass | 设置客户端认证密码 | 关闭 |
maxclients | 设置同时连接的最大客户端数量,一旦达到了限制,Redis会关闭所有的新连接并发送一个"max number of clients reached"的错误 | 关闭,默认10000 |
maxmemory | 不要使用超过指定数量的内存,一旦达到了,Redis会尝试使用驱逐策略来移除键 | 关闭 |
appendonly | 是否开启AOF | no |
appendfilename | AOF文件名称 | appendonly.aof |
requirepass | 设置客户端认证密码 | 关闭 |
分段设计法
来设计Key名称。使用冒号把Key中要表达的多种含义分开表示,步骤如下:
举例:用户表(user)
id | name | |
---|---|---|
10010 | zhangsan | zhangsan@qq.com |
10086 | lisi | lisi@qq.com |
假设有这样的需求:根据用户id查询用户邮箱地址,可以选择把邮箱地址存到redis中:
set user:id:10010:email zhangsan@qq.com;
set user:id:10086:email lisi@qq.com;
127.0.0.1:6379> mset user:id:10010:email zhangsan@qq.com user:id:10086:email lisi@qq.com
OK
127.0.0.1:6379> mget user:id:10010:email user:id:10086:email
1) "zhangsan@qq.com"
2) "lisi@qq.com"
127.0.0.1:6379>
上面说了Redis是Key-Value结构的非关系型数据库,其中Key只能是字符串(String),Value有多种数据结构:
Redis Web版本的客户端
。key
key
nil
key
改名为 newkey
127.0.0.1:6379[1]> set user:id:1:name xq
OK
127.0.0.1:6379[1]> get user:id:1:name
"xq"
127.0.0.1:6379[1]> set user:id:1:name xxxq
OK
127.0.0.1:6379[1]> get user:id:1:name
"xxxq"
127.0.0.1:6379[1]> getset user:id:1:name zwq
"xxxq"
127.0.0.1:6379[1]> get user:id:1:name
"zwq"
127.0.0.1:6379[1]> set user:id:1:age 22
OK
127.0.0.1:6379[1]> incr user:id:1:age
(integer) 23
127.0.0.1:6379[1]> decr user:id:1:age
(integer) 22
127.0.0.1:6379[1]> incrby user:id:1:height 5
(integer) 5
127.0.0.1:6379[1]> decrby user:id:1:height 3
(integer) 2
127.0.0.1:6379[1]> append user:id:1:address guangdong
(integer) 9
127.0.0.1:6379[1]> append user:id:1:address guangzhou
(integer) 18
127.0.0.1:6379[1]> get user:id:1:address
"guangdongguangzhou"
127.0.0.1:6379[1]> hset user:id:2 name zwq
(integer) 1
127.0.0.1:6379[1]> hset user:id:2 age 22
(integer) 1
127.0.0.1:6379[1]> hget user:id:2 name
"zwq"
127.0.0.1:6379[1]> hgetall user:id:2
1) "name"
2) "zwq"
3) "age"
4) "22"
127.0.0.1:6379[1]> hmset user:id:3 name zs age 18
OK
127.0.0.1:6379[1]> hmget user:id:3 name age
1) "zs"
2) "18"
127.0.0.1:6379[1]> hlen user:id:3
(integer) 2
127.0.0.1:6379[1]> hexists user:id:3 age
(integer) 1
127.0.0.1:6379[1]> hincrby user:id:3 age 10
(integer) 28
127.0.0.1:6379[1]> lpush grade:7 class1 class2 class3
(integer) 3
127.0.0.1:6379[1]> rpush grade:7 class6 class5 class4
(integer) 6
127.0.0.1:6379[1]> lrange grade:7 0 5
1) "class3"
2) "class2"
3) "class1"
4) "class6"
5) "class5"
6) "class4"
key不存在,插入失败
127.0.0.1:6379[1]> lpushx grade:8 class7
(integer) 0
127.0.0.1:6379[1]> rpushx grade:8 class8
(integer) 0
命令 | 作用 |
---|---|
lpush key value [value …] | 将一个或者多个值插入到列表key的表头 |
rpush key value [value …] | 将一个或者多个值插入到列表key的表尾 |
lpushx key value | 当且仅当key存在时将值value插入到key的表头 |
rpushx key value | 当且仅当key存在时将值value插入到key的表尾 |
lpop key | 移除并返回列表key的头元素 |
rpop key | 移除并返回列表的尾元素 |
blpop key [key …] timeout | lpop的阻塞式指令 |
brpop key [key …] timeout | rpop的阻塞式指令 |
rpoplpush source destination | 将列表Source的尾元素弹出以及返回客户端,并且将该元素插入到destination列表中 |
brpoplpush source destination timeout | rpoplpush的阻塞版 |
lindex key index | 返回key中下表为index的元素 |
linsert key before | after pivot value |
llen key | 返回列表key的长度 |
lrange key start stop | 返回列表key中指定区间内的元素 |
lrem key count value | 根据count的值,移除列表中与参数value相等的元素 |
lset key index value | 将列表key下表为index的元素值设置为value,0代表链表的头元素,-1代表链表的尾元素 |
ltrim key start stop | 对一个列表进行trim |
命令 | 作用 |
---|---|
sadd key member [member …] | 将元素加入到集合key中,已经有的忽略 |
scard key | 返回集合key的元素个数 |
sdiff key [key …] | 返回一个集合的全部成员,该集合是所有给定集合之间的差集 |
sdiffstore destination key [key …] | 返回集合之间的差集,并将它保存在destination集合中 |
sinter key [key …] | 返回集合中给定集合的交集 |
sinterstore destination key [key …] | 返回给定集合之间的差集,并将它保存在destination集合中 |
sismember key member | 判断member元素是否为集合key成员 |
smembers key | 返回集合中的所有成员 |
smove source destination member | 将member元素从source集合移动到destination集合 |
spop key | 移除并返回集合中的一个随机元素 |
srandmember key [count] | 返回指定count个数的集合,count为正数表示不能重复,负数可以重复 |
srem key member [member …] | 移除集合key中的多个元素 |
sunion key [key …] | 返回所有指定key的并集 |
127.0.0.1:6379> sadd names zs ls ww zl
(integer) 4
127.0.0.1:6379> sadd namess zs zl
(integer) 2
127.0.0.1:6379> sinter names namess
1) "zl"
2) "zs"
命令 | 作用 |
---|---|
zadd key source member [[source member] […]] | 将一个或者多个member元素及其score值加入到有序集合key中 |
zcard key | 返回有序集合key的元素个数 |
zcount key min max | 返回有序集合key中,score值在min和max之间的元素个数 |
zincrby key increment member | 为有序集合key的成员member的score值加上增量increment |
zrange key start stop | 返回有序集key中,指定下标区间内的成员 |
zrevrange key start stop [withscores] | 返回指定区间内的成员递减顺序 |
zrangebyscore key min max [withscopes] [limit offset count] | 返回score值介于min和max之间的集合 |
zrank key member | 返回有序集key中成员member的排名 |
zrevrank key member | 返回有序集key中成员member的递减排名 |
zrem key member [member …] | 移除有序集key中的多个成员 |
zremrangebyrank key start stop | 移除有序集key中,指定排名区间内的所有成员 |
zremrangebyscore key min max | 移除有序集key中,指定score范围内的成员 |
zscore key member | 返回成员member的score值 |
127.0.0.1:6379> zadd mathScore 98 zs 97 ls 76 ww 100 zl
(integer) 4
127.0.0.1:6379> zcard mathScore
(integer) 4
127.0.0.1:6379> zscore mathScore ww
"76"
Redis在安装之后有一个redis-benchmark,这个就是Redis提供用于做性能测试的,它可以用来模拟N个客户端同时发出M个请求。首先看一下redis-benchmark自带的一些参数:
命令 | 作用 | 默认值 |
---|---|---|
-h | 服务器名称 | 127.0.0.1 |
-p | 服务器端口 | 6379 |
-s | 服务器Socket | 无 |
-c | 并行连接数 | 50 |
-n | 请求数 | 10000 |
-d | SET/GET值的字节大小 | 2 |
-k | 1表示keep alive,0表示重连 | 1 |
-r | SET/GET/INC使用随机Key而不是常量,在形式上key样子为mykey_ran:000000012456,-r的值决定了value的最大值 | 无 |
-p | 使用管道请求 | 1,即不使用管道 |
-q | 安静模式,只显示query/sec值 | 无 |
–csv \使用csv格式输出 | 无 | |
-l | 循环,无限运行测试 | 无 |
-t | 只运行使用逗号分割的命令的测试 | 无 |
-I | 空闲模式,只打开N个空闲线程并且等待 | 无 |
D:\Redis>redis-benchmark.exe -q PING_INLINE: 44883.30 requests per second PING_BULK: 45641.26 requests per second SET: 37105.75 requests per second GET: 41237.11 requests per second INCR: 44208.66 requests per second LPUSH: 42625.75 requests per second LPOP: 44702.73 requests per second SADD: 44863.16 requests per second SPOP: 44822.95 requests per second LPUSH (needed to benchmark LRANGE): 44622.94 requests per second LRANGE_100 (first 100 elements): 23126.73 requests per second LRANGE_300 (first 300 elements): 12220.46 requests per second LRANGE_500 (first 450 elements): 9390.55 requests per second LRANGE_600 (first 600 elements): 7499.63 requests per second MSET (10 keys): 36941.26 requests per second
redis-benchmark -q -r 100000 -n 1000000
,从测试结果来看,和上面测试的差不多,说明Redis读写能力在Key和Value是否丰富上没多大关系,还是和电脑配置和网络带宽有关些。D:\Redis>redis-benchmark -q -r 100000 -n 1000000 PING_INLINE: 45968.56 requests per second PING_BULK: 47279.09 requests per second SET: 40817.99 requests per second GET: 44265.42 requests per second INCR: 44064.51 requests per second LPUSH: 44724.72 requests per second LPOP: 44974.14 requests per second SADD: 41211.62 requests per second SPOP: 45091.76 requests per second LPUSH (needed to benchmark LRANGE): 47034.48 requests per second LRANGE_100 (first 100 elements): 24550.12 requests per second LRANGE_300 (first 300 elements): 12818.54 requests per second LRANGE_500 (first 450 elements): 9410.61 requests per second LRANGE_600 (first 600 elements): 7476.92 requests per second MSET (10 keys): 31666.61 requests per second
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。