redis缓存数据库

应用场景

  • 存储临时数据(登录验证码,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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值