应用场景
-
存储临时数据(登录验证码,HttpSession,未付款的订单)
-
做热频数据(互联网项目(热门主播,热搜),业务项目(系统用户,字典项)),被频繁的查询,又不经常改动.
-
高并发处理(秒杀活动,抢购)
-
做计数器()
-
做排行榜(主播排行榜,学生成绩排行榜)
-
做消息队列(mq队列中间件)
优缺点
优势
提高查询效率(内存操作);解决高并发数据安全问题(redis是单线程模型设计);
缺点
代码复杂度提高;需要维护redis与mysql的数据一致性(缓存中的数据设置有效时间随机60+20分钟(常规方案);同时维护redis与mysql);由于缓存中的数据在同一时刻大量失效,造成redis缓存的穿透,进入mysql数据,造成mysql雪崩.
windows下安装redis服务端与客户端
redis-service.exe
启动服务:redis-server.exe redis.windows.conf
安装后台服务:redis-server.exe --service-install redis.windows.conf
卸载后台服务:redis-server.exe --service-uninstall
redis-cli.exe
客户端连接服务器:redis-cli.exe -h ip -p port -a password
redis-check-aof.exe
修复aof文件:redis-check-aof.exe --fix aof文件名
redis.check-dump.exe
修复dump文件:rdis-check-dump.exe --fix dump文件名
redis.windows.conf
port 6379 服务器端口
databases 16 服务器默认提供的数据库数量(0-15)
save 900 1 服务器的rdb持久化策略
save 300 10
save 60 10000
dbfilename dump.rdb 服务器的rdb持久化文件名
dir ./ 持久化文件路径
requirepass root 客户端连接服务器密码
appendonly yes 是否开启aof持久化
appendfilename "appendonly.aof" aof持久化文件名
auto-aof-rewrite-percentage 100 aof持久化重写策略
auto-aof-rewrite-min-size 64mb
redis的两种持久化策略
rdb持久化:
在指定时间内发生一定量的数据改变会触发rdb持久化
在指定目录下存储XXXXX.dump文件
数据丢失的风险大.
aof持久化:
每秒钟把命令存储到aof文件.
在指定目录下存储XXXXX.aof文件
数据丢失风险小.
redis的5种数据类型以及对应操作命令
redis是一个kv数据库,类似HashMap<String,T>,这里所谓redis的5种数据库类型,类似于HashMap的value的各种类型
redis存数据-key:String,Value:5种类型(String,List,Set,Hash,SortedSet)
select 选择切换
192.168.13.237:6379> select 2
OK
string(最重要),使用最频繁
set,get,getset,incr,decr,incrby,decrby,setex,setnx(分布式锁)
1.set作用:将字符串值 value 关联到 key
192.168.13.237:6379[2]> set laowang 69
OK
2.get作用:得到key的值
192.168.13.237:6379[2]> get laowang
"69"
3.getset作用:给key改值,并得到之前的vule值
192.168.13.237:6379[2]> getset laowang 75
"69"
4.incr:给key的vue增1,切记,vue必须为数字
incrby:可以设置给key的vue增多少范围的值
decr:减一
decrby:减范围值
192.168.13.237:6379[2]> incr laowang
(integer) 76
192.168.13.237:6379[2]> incrby laowang 4
(integer) 80
错误演示:
192.168.13.237:6379[2]> set li shuaige
OK
192.168.13.237:6379[2]> incr li
(error) ERR value is not an integer or out of range
4.setex:将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
下图,设置一个计时器,定时5秒,在5秒内可以取到数据,5秒后为nil(null的意思)
192.168.13.237:6379[2]> setex jsq 5 uname:jsq
OK
192.168.13.237:6379[2]> get jsq
"uname:jsq"
192.168.13.237:6379[2]> get jsq
(nil)
ttl:获取剩余有效时间.
192.168.13.237:6379[2]> setex sj 20 xianshi
OK
192.168.13.237:6379[2]> ttl sj
(integer) 15
192.168.13.237:6379[2]> ttl sj
(integer) 11
192.168.13.237:6379[2]> ttl sj
(integer) 8
192.168.13.237:6379[2]> ttl sj
(integer) 7
192.168.13.237:6379[2]> ttl sj
(integer) 5
192.168.13.237:6379[2]> ttl sj
(integer) 3
192.168.13.237:6379[2]> ttl sj
(integer) 2
192.168.13.237:6379[2]> ttl sj
(integer) 0
192.168.13.237:6379[2]> ttl sj
(integer) -2
192.168.13.237:6379[2]> ttl sj
(integer) -2
5.setnx:如果key不存在,执行操作,若存在,不执行任何操作
192.168.13.237:6379[2]> set ceshi uname:mytest
OK
192.168.13.237:6379[2]> setnx ceshi 123
(integer) 0
192.168.13.237:6379[2]> setnx haha 123
(integer) 1
192.168.13.237:6379[2]> get haha
"123"
List(最重要):存储有序集合数据,比如红包池,ArrayList
lpush,lpop,lrange,llen,lindex
用发红包做一个例子,首先发一个红包,里边有价值不等的人民币
1.lpush:将一个或多个值 value 插入到列表 key 的表头,从左往右添加,用空格隔开
例如:
-----------
6 5 4 3 2 1
-----------
192.168.13.237:6379[2]> lpush hb 1 2 3 4 5 6
(integer) 6
2.lpop::移除并返回列表 key 的头元素,从左往右弹出
192.168.13.237:6379[2]> lpop hb
"6"
192.168.13.237:6379[2]> lpop hb
"5"
192.168.13.237:6379[2]> lpop hb
"4"
192.168.13.237:6379[2]> lpop hb
"3"
192.168.13.237:6379[2]> lpop hb
"2"
192.168.13.237:6379[2]> lpop hb
"1"
192.168.13.237:6379[2]> lpop hb
(nil)
3.lrange:
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
192.168.13.237:6379[2]> lpush hb 1 3 5 7 2 4 9
(integer) 7
192.168.13.237:6379[2]> lrange hb 0 -1
1) "9"
2) "4"
3) "2"
4) "7"
5) "5"
6) "3"
7) "1"
4.llen:获得长度
192.168.13.237:6379[2]> llen hb
(integer) 7
5.lindex:所得索引值代表的数据。每个数据都有两个索引值,一个从左往右数,从0开始,一个从右往左数,从-1开始
192.168.13.237:6379[2]> lindex hb -1
"1"
192.168.13.237:6379[2]> lindex hb 6
"1"
Hash(最重要) HashMap<String,HashMap<>>
hset,hget,hkeys,hvals,hgetall,hexists,hdel,hlen,hmset,hmget
1.hset:
HSET key field value
将哈希表 key 中的域 field 的值设为 value 。
如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
如果域 field 已经存在于哈希表中,旧值将被覆盖
192.168.13.237:6379[2]> hset user li 11
(integer) 1
192.168.13.237:6379[2]> hset user li 22
(integer) 0
192.168.13.237:6379[2]> hget user li
"22"
2.hget:
HGET key field
返回哈希表 key 中给定域 field 的值。
3.hkeys:
HKEYS key
返回哈希表 key 中的所有域。
192.168.13.237:6379[2]> hkeys user
1) "11"
2) "22"
3) "33"
4.hvals:
HVALS key
返回哈希表 key 中所有域的值。
192.168.13.237:6379[2]> hvals user
1) "li"
2) "wang"
3) "gong"
5.hgetall:
HGETALL key
返回哈希表 key 中,所有的域和值。
192.168.13.237:6379[2]> hgetall user
1) "11"
2) "li"
3) "22"
4) "wang"
5) "33"
6) "gong"
6.hexists:
HEXISTS key field
查看哈希表 key 中,给定域 field 是否存在。
192.168.13.237:6379[2]> hexists user 11
(integer) 1
7.hdel
HDEL key field [field ...]
删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
192.168.13.237:6379[2]> hdel user 11
(integer) 1
192.168.13.237:6379[2]> hkeys user
1) "22"
2) "33"
8.hlen
HLEN key
返回哈希表 key 中域的数量。
192.168.13.237:6379[2]> hlen user
(integer) 2
9.hmset
HMSET key field value [field value ...]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
此命令会覆盖哈希表中已存在的域。
如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
192.168.13.237:6379[2]> hmset user 44 zhao 55 yan
OK
192.168.13.237:6379[2]> hgetall user
1) "22"
2) "wang"
3) "33"
4) "gong"
5) "44"
6) "zhao"
7) "55"
8) "yan"
10.hmget
HMGET key field [field ...]
返回哈希表 key 中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个 nil 值。
因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
192.168.13.237:6379[2]> hmget user 11 55
1) (nil)
2) "yan"
Set,无序集合,(数据随机弹出,能够set集合之间的交并差)
sadd,spop,smembers,sdiff,sunion,sinter
1.sadd
SADD key member [member ...]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
当 key 不是集合类型时,返回一个错误。
192.168.13.237:6379[2]> sadd hb 1 2 3 8 8
(integer) 4
2.spop
SPOP key
移除并返回集合中的一个随机元素。
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
192.168.13.237:6379[2]> spop hb
"3"
192.168.13.237:6379[2]> srandmember hb
"8"
192.168.13.237:6379[2]> smembers hb
1) "1"
2) "2"
3) "8"
3.smembers
SMEMBERS key
返回集合 key 中的所有成员。
不存在的 key 被视为空集合。
192.168.13.237:6379[2]> smembers hb
1) "1"
2) "2"
3) "8"
4.sdiff
SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
不存在的 key 被视为空集。
注释:取那个key的差集,就把哪个放到前边来
192.168.13.237:6379[2]> smembers hb
1) "1"
2) "2"
3) "8"
192.168.13.237:6379[2]> smembers kl
1) "1"
2) "4"
3) "5"
4) "7"
5) "9"
192.168.13.237:6379[2]> sdiff hb kl
1) "2"
2) "8"
5.sunion
SUNION key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。
不存在的 key 被视为空集
192.168.13.237:6379[2]> smembers hb
1) "1"
2) "2"
3) "8"
192.168.13.237:6379[2]> smembers kl
1) "1"
2) "4"
3) "5"
4) "7"
5) "9"
192.168.13.237:6379[2]> sunion hb kl
1) "1"
2) "2"
3) "4"
4) "5"
5) "7"
6) "8"
7) "9"
6.sinter
SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的 key 被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
192.168.13.237:6379[2]> sinter hb kl
1) "1"
SortedSet(对集合中的数据进行排序),该集合中的每个数据,都要有一个数值型的成绩
zadd:(添加key 成绩 成员 成绩 成员。。。。。)
ZADD key score member [[score member] [score member] ...]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
对有序集的更多介绍请参见 sorted set 。
192.168.13.237:6379[2]> zadd score 42 li 65 wang 77 zhao 92 feng
(integer) 4
zrange:获取排名区间成员,成绩升序 zrange key 0 -1
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序(lexicographical order )来排列。
如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
192.168.13.237:6379[2]> zrange score 0 -1
1) "li"
2) "wang"
3) "zhao"
4) "feng"
zrevrange,获取排名区间成员,成绩降序
ZREVRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
192.168.13.237:6379[2]> zrevrange score 0 -1
1) "feng"
2) "zhao"
3) "wang"
4) "li"
zcount:获取成绩区间个数,zcount key min max
ZCOUNT key min max
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。
192.168.13.237:6379[2]> zcount score 0 60
(integer) 1
192.168.13.237:6379[2]> zcount score 60 80
(integer) 2
192.168.13.237:6379[2]> zcount score 80 100
(integer) 1
zincrby:修改某个成员成绩 zincrby key 修改至 成员名
ZINCRBY key increment member
为有序集 key 的成员 member 的 score 值加上增量 increment 。
可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
score 值可以是整数值或双精度浮点数
192.168.13.237:6379[2]> zincrby score 20 ku
"20"
192.168.13.237:6379[2]> zincrby score 15 li
"57"
192.168.13.237:6379[2]> zincrby score -15 li
"42"
zrank:获取某个成员的排名,成绩升序, zrank key 成员名
ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
192.168.13.237:6379[2]> zrank score ku
(integer) 0
zrevrank:获取某个成员的排名,成绩降序 zrevrank key 成员名
ZREVRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
192.168.13.237:6379[2]> zrevrank score ku
(integer) 4
zrangebyscore:获取成绩区间成员,zrangebyscore key min max
ZREMRANGEBYSCORE key min max
获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
192.168.13.237:6379[2]> zrangebyscore score 0 60
1) "ku"
2) "li"
zscore:获取某个成员的成绩
ZSCORE key member
返回有序集 key 中,成员 member 的 score 值。
如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
192.168.13.237:6379[2]> zscore score li
"42"
key相关指令
keys:找到key的集合
KEYS pattern
查找所有符合给定模式 pattern 的 key 。
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
192.168.13.237:6379[2]> keys *
1) "score"
2) "kl"
3) "hb"
192.168.13.237:6379[2]> keys s?ore
1) "score"
del:删除指定的key
DEL key [key ...]
删除给定的一个或多个 key 。
不存在的 key 会被忽略。
192.168.13.237:6379[2]> del hahahah
(integer) 0
192.168.13.237:6379[2]> del hb
(integer) 1
expire:对指定的key设置超时时间
为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
192.168.13.237:6379[2]> expire kl 20
(integer) 1
192.168.13.237:6379[2]> ttl kl
(integer) 14
192.168.13.237:6379[2]> ttl kl
(integer) 11
192.168.13.237:6379[2]> ttl kl
(integer) 10
192.168.13.237:6379[2]> ttl kl
(integer) 8
192.168.13.237:6379[2]> ttl kl
(integer) 7
192.168.13.237:6379[2]> ttl kl
(integer) 5
192.168.13.237:6379[2]> ttl kl
(integer) 4
192.168.13.237:6379[2]> ttl kl
(integer) 3
192.168.13.237:6379[2]> ttl kl
(integer) 0
192.168.13.237:6379[2]> ttl kl
(integer) -2
exists:判断指定的key是否存在.
192.168.13.237:6379[2]> exists kl
(integer) 1
ttl:获取剩余有效时间.
192.168.13.237:6379[2]> expire kl 20
(integer) 1
192.168.13.237:6379[2]> ttl kl
(integer) 14
192.168.13.237:6379[2]> ttl kl
(integer) 11
192.168.13.237:6379[2]> ttl kl
(integer) 10
192.168.13.237:6379[2]> ttl kl
(integer) 8
192.168.13.237:6379[2]> ttl kl
(integer) 7
192.168.13.237:6379[2]> ttl kl
(integer) 5
192.168.13.237:6379[2]> ttl kl
(integer) 4
192.168.13.237:6379[2]> ttl kl
(integer) 3
192.168.13.237:6379[2]> ttl kl
(integer) 0
192.168.13.237:6379[2]> ttl kl
(integer) -2
type:获取key的类型.
TYPE key
返回 key 所储存的值的类型。
192.168.13.237:6379[2]> type kl
set