01--分布式缓存数据库Redis

1. 简介

1.1 背景

我们现在的项目架构中,基本上是Web服务器(Tomcat)和数据库独立部署,独占服务器资源。随着用户的增长,并发读写数据库,会加大数据库访问的压力,导致其性能下降,严重时会直接导致系统宕机,例如:

此时,我们可以在Tomcat同服务器上增加本地缓存,并在外部增加分布式缓存,缓存热门数据。也就是通过缓存能把绝大多数请求在到读写数据库之前拦截下来,大大降低数据库的压力。

基于这样的一种架构设计,于是类似redis的一些分布式数据库就诞生了。

1.2 Redis概述

Redis是一个key-value存储系统(官网:http://redis.io),是一个分布式缓存数据库。

1.3 版本及参考说明

Redis的次版本号(第一个小数点后的数字)为偶数的版本是稳定版本(2.4、2.6等),奇数为非稳定版本(2.5、2.7),一般推荐在生产环境使用稳定版本。最新版本6.2.2,新增了stream的处理方式,性能更高。Redis官方是不支持windows平台的,windows版本是由微软自己建立的分支,基于官方的Redis源码上进行编译、发布、维护的,所以windows平台的Redis版本要略低于官方版本。
Redis 相关参考网址如下所示:

Bootnb 相关:https://www.runoob.com/redis/redis-tutorial.html
Redis 官网:https://redis.io/
源码地址:https://github.com/redis/redis
Redis 在线测试:http://try.redis.io/
Redis 命令参考:http://doc.redisfans.com/

2. Redis初始化操作

2.1 启动redis服务

Docker 环境下的启动:

docker start redis #底层也是通过redis-server启动,start单词后的redis为容器名

docker 中查看redis 服务

docker ps

查看启动的redis进程信息

ps -ef|grep redis

例如:
root 3511 1 0 16:29 ? 00:00:01 redis-server *:6379
root 3515 1 0 16:29 ? 00:00:01 redis-server 127.0.0.1:6380

2.2 进入Redis容器

docker exec -it redis01 bash #redis01 为容器名

2.3 登录Redis服务

登录本地redis

redis-cli
或者
redis-cli -p 6379
或者
redis-cli -p 6379 -a  password #-a后面为password,此操作需要开启redis.conf文件中的 requirepass选项

登录远程redis

redis-cli  -h ip  -p 6379  -a  password

2.4 查看redis信息

首先登陆redis,然后输入info指令,例如

127.0.0.1:6379> info		#查看当前redis节点的详细配置信息

2.5 清空redis屏幕

清除redis屏幕内容

127.0.0.1:6379> clear

2.6 退出redis服务

退出redis服务。

127.0.0.1:6379> exit

2.7 关闭redis服务

关闭redis服务。

127.0.0.1:6379> shutdown

2.8 系统帮助

可以基于help指令查看相关指令帮助。

127.0.0.1:6379> help
redis-cli 2.8.19
Type: "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit
127.0.0.1:6379> help type

  TYPE key
  summary: Determine the type stored at key
  since: 1.0.0
  group: generic

3. Redis数据存储操作

3.1 简易数据存取操作

查看redis中的key

127.0.0.1:6379> keys *
(empty list or set)

基于key-value形式存储数据

127.0.0.1:6379> set test1 123
OK
127.0.0.1:6379> set test2 ab
OK
127.0.0.1:6379> keys *
1) "test1"
2) "test2"

基于key获取redis中存储的数据

127.0.0.1:6379> get test1
"123"
127.0.0.1:6379> get test2
"ab"
127.0.0.1:6379> get test3
(nil)
127.0.0.1:6379>

清除当前数据库中的数据

127.0.0.1:6379> flushdb
OK

清除所有数据库数据

127.0.0.1:6379> flushall
OK

3.2 key有效时间的设计

实际工作中我们会经常控制redis中key的有效时长,例如:秒杀操作的计时,缓存数据的有效时长等。
expire(设置有效时长-单位:秒)

  • 语法:expire key seconds
127.0.0.1:6379> set bomb tnt
OK
127.0.0.1:6379> expire bomb 10
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) 5
127.0.0.1:6379> ttl bomb
(integer) 3
127.0.0.1:6379> ttl bomb
(integer) 3
127.0.0.1:6379> ttl bomb
(integer) 2
127.0.0.1:6379> ttl bomb
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) -2
127.0.0.1:6379> ttl bomb
(integer) -2
127.0.0.1:6379>

其中,ttl 可查看key的剩余的有效时长,当返回值为-2时,表示该key已经不存在了。当key存在但没有设置有效时长时,会返回-1。

  • persist(取消有效时长的设置)
    其中,设置新的数据时需要重新设置该key的生存时间,重新设置值也会清除生存时间。
    语法:persist key
127.0.0.1:6379> set bomb tnt
OK
127.0.0.1:6379> expire bomb 60
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) 49
127.0.0.1:6379> persist bomb
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) -1
127.0.0.1:6379>
  • pexpire (单位毫秒) 让key的生效时长以毫秒作为计量单位,这样可以做到更精确的时间控制。例如,可应用于秒杀场景。
    语法:pexpire key milliseconds
127.0.0.1:6379> set bomb tnt
OK
127.0.0.1:6379> pexpire bomb 10000
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) 6
127.0.0.1:6379> ttl bomb
(integer) 3
127.0.0.1:6379> ttl bomb
(integer) -2
127.0.0.1:6379>

4. redis常用数据类型操作

Redis作为一种key/value结构的数据存储系统,为了便于对数据进行进行管理,提供了多种数据类型。然后,基于指定类型存储我们项目中产生的数据,例如用户的登陆信息,购物车信息,商品详情信息等等。

  • 常用数据类型:
    Reids中基础数据结构包含字符串、散列,列表,集合,有序集合。工作中具体使用哪种类型要结合具体场景。

4.1 String类型操作

字符串类型是redis中最简单的数据类型,它存储的值可以是字符串,其最大字符串长度支持到512M。基于此类型,可以实现博客的字数统计,将日志不断追加到指定key,实现一个分布式自增iid,实现一个博客的的点赞操作等。

4.1.1 incr/incrby(自增)

  • 当存储的字符串是整数时,redis提供了一个实用的命令incr,其作用是让当前键值递增,并返回递增后的值。
    语法:incr key
127.0.0.1:6379> set b 1
OK
127.0.0.1:6379> incr b
(integer) 2
127.0.0.1:6379> get b
"2"

说明:如果b不存在,会自动创建.

  • 指定增长系数
    语法:incrby key increment
127.0.0.1:6379> incrby b 2
(integer) 4
127.0.0.1:6379> incrby b 4
(integer) 8
127.0.0.1:6379>

4.1.2 decr/decrby (自减)

自减指定的整数
decr key 按照默认步长(默认为1)进行递减
decrby key decrement 按照指定步长进行递减

127.0.0.1:6379> set a 10
OK
127.0.0.1:6379> get a
"10"
127.0.0.1:6379> decr a
(integer) 9
127.0.0.1:6379> decrby a 3
(integer) 6
127.0.0.1:6379> get a
"6"

4.1.3 append (拼接)

向尾部追加值
如果key键不存在则创建key,其值为写的value,即相当于set key value。返回值是追加后字符串的总长度。
语法:append key value

127.0.0.1:6379> append k "abc"
(integer) 3
127.0.0.1:6379> append k "defg"
(integer) 7

4.1.4 strlen (计算字符串长度)

计算字符串长度,返回数据的长度,如果键不存在则返回0。注意,如果键值为空串,返回也是0。
语法:strlen key

127.0.0.1:6379> set a1 "abcdfe12345"
OK
127.0.0.1:6379> get a1
"abcdfe12345"
127.0.0.1:6379> strlen a1
(integer) 11

4.1.5 mset/mget(设置/获取多个键值)

同时设置或者获取多个键值
语法:mset key value [key value …]、mget key [key …]

127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"

4.1.5 del(删除键)

127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> del b
(integer) 1
127.0.0.1:6379> del c
(integer) 1
127.0.0.1:6379> mget a b c
1) (nil)
2) (nil)
3) (nil)

4.2 Hash类型操作

Redis散列类型相当于Java中的HashMap,实现原理跟HashMap一致,一般用于存储对象信息,存储了字段(field)和字段值的映射,一个散列类型可以包含最多232-1个字段。

4.2.1 hset/hget(取值/赋值)

hset 命令不区分插入和更新操作,当执行插入操作时hset命令返回1,当执行更新操作时返回0。

127.0.0.1:6379> hset person name zhangqiang age 20 sex boy
(integer) 3
127.0.0.1:6379> hget person name
"zhangqiang"
127.0.0.1:6379> hget person age
"20"
127.0.0.1:6379> hget person sex
"boy"

4.2.2 hincrby(自增)

127.0.0.1:6379> hset person name zhangqiang age 20 sex boy
(integer) 3
127.0.0.1:6379> hincrby person age 2
(integer) 22
127.0.0.1:6379> hincrby person age -2
(integer) 20
127.0.0.1:6379>

4.2.3 hmset/hmget(设置/获取多个对象属性)

127.0.0.1:6379> hmset person name zhangsan age 20 sex boy
OK
127.0.0.1:6379> hmget person name age sex
1) "zhangsan"
2) "20"
3) "boy"

4.2.4 hexists(判断属性是否存在)

127.0.0.1:6379> hmget person name age sex
1) "zhangsan"
2) "20"
3) "boy"
127.0.0.1:6379> hexists person name
(integer) 1
127.0.0.1:6379> hexists person adress
(integer) 0

4.2.5 hdel (删除属性)

127.0.0.1:6379> hget person name
"zhangsan"
127.0.0.1:6379> hdel person name
(integer) 1
127.0.0.1:6379> hget person name
(nil)

4.2.6 hkeys/hvals(获取字段名或者字段值)

127.0.0.1:6379> hmset person name zhangsan age 20 sex boy
OK
127.0.0.1:6379> hkeys person
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals person
1) "zhangsan"
2) "20"
3) "boy"

4.3 List类型操作

Redis的list类型相当于java中的LinkedList,其原理就就是一个双向链表。支持正向、反向查找和遍历等操作,插入删除速度比较快。经常用于实现热销榜,最新评论等的设计。

4.3.1 lpush/rpush(添加元素)lrange(查看元素)

lpush 在key对应list的头部添加字符串元素。rpush在对应的list的尾部添加字符串元素。
lrange 返回列表中指定区间内的元素(0表示第一个元素,-1表示最后一个元素)

127.0.0.1:6379> lpush str "A" "B" "C"
(integer) 3
127.0.0.1:6379> lrange str 0 -1
1) "C"
2) "B"
3) "A"
127.0.0.1:6379> rpush str1 "A" "B" "C"
(integer) 3
127.0.0.1:6379> lrange str1 0 -1
1) "A"
2) "B"
3) "C"

4.3.2 del(删除列表)

127.0.0.1:6379> del str1
(integer) 1
127.0.0.1:6379> lrange str1 0 -1
(empty array)

4.3.3 linsert (插入元素)

在key对应list的特定位置之前或之后添加字符串元素。

127.0.0.1:6379> lrange str 0 -1
1) "C"
2) "B"
3) "A"
127.0.0.1:6379> linsert str before "B" "YYDS"
(integer) 4
127.0.0.1:6379> linsert str after "A" "YADX"
(integer) 5
127.0.0.1:6379> lrange str 0 -1
1) "C"
2) "YYDS"
3) "B"
4) "A"
5) "YADX"

4.3.2 lset(修改元素值)

设置list中指定下标的元素值(一般用于修改操作)。

127.0.0.1:6379> lrange str 0 -1
1) "C"
2) "YYDS"
3) "B"
4) "A"
5) "YADX"
127.0.0.1:6379> lset str 0 "CGB"
OK
127.0.0.1:6379> lrange str 0 -1
1) "CGB"
2) "YYDS"
3) "B"
4) "A"
5) "YADX"

4.3.3 lrem(删除指定个数的相同元素)

从key对应list中删除count个与value相同的元素。
count>0时,按从头到尾的顺序删除。
count=0时,删除全部。
count<0时,按从尾到头的顺序删除。

127.0.0.1:6379> lpush str A B A C D A B
(integer) 7
127.0.0.1:6379> lrange str 0 -1
1) "B"
2) "A"
3) "D"
4) "C"
5) "A"
6) "B"
7) "A"
127.0.0.1:6379> lrem str 2 A
(integer) 2
127.0.0.1:6379> lrange str 0 -1
1) "B"
2) "D"
3) "C"
4) "B"
5) "A"

4.3.4 ltrim (保留指定范围的数据)

127.0.0.1:6379> lrange str 0 -1
1) "B"
2) "D"
3) "C"
4) "B"
5) "A"
127.0.0.1:6379> ltrim str 1 -2
OK
127.0.0.1:6379> lrange str 0 -1
1) "D"
2) "C"
3) "B"

4.3.5 lpop/rpop (删除元素并返回)

lpop从list的头部删除元素,并返回删除元素。
rpop从list的尾部删除元素,并返回删除元素。

127.0.0.1:6379> lrange str 0 -1
1) "D"
2) "C"
3) "B"
127.0.0.1:6379> lpop str
"D"
127.0.0.1:6379> rpop str
"B"
127.0.0.1:6379> lrange str 0 -1
1) "C"

4.3.6 lindex(返回指定下标的元素)/llen(返回列表长度)

返回名称为key的list中index位置的元素。

127.0.0.1:6379> lpush str1 A B C D E F
(integer) 6
127.0.0.1:6379> lindex str1 0
"F"
127.0.0.1:6379> lindex str1 -1
"A"
127.0.0.1:6379> llen str1
(integer) 6

4.3.7 rpoplpush (移除并添加)

从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,如果第一个list是空或者不存在返回nil。

127.0.0.1:6379> lrange str 0 -1
1) "C"
127.0.0.1:6379> lrange str1 0 -1
1) "F"
2) "E"
3) "D"
4) "C"
5) "B"
6) "A"
127.0.0.1:6379> rpoplpush str1 str
"A"
127.0.0.1:6379> rpoplpush str1 str
"B"
127.0.0.1:6379> rpoplpush str1 str
"C"
127.0.0.1:6379> lrange str 0 -1
1) "C"
2) "B"
3) "A"
4) "C"

4.4 set类型操作

Redis的Set类似Java中的HashSet,是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

4.4.1 saad(添加元素)

127.0.0.1:6379> sadd name jack
(integer) 1
127.0.0.1:6379> sadd name tom
(integer) 1
127.0.0.1:6379> sadd name sara
(integer) 1

4.4.2 smembers(获取全部内容)

127.0.0.1:6379> smembers name
1) "sara"
2) "tom"
3) "jack"

4.4.3 spop (移除元素)

移除并返回集合中的一个随机元素。

127.0.0.1:6379> smembers name
1) "sara"
2) "tom"
3) "jack"
127.0.0.1:6379> spop name
"jack"

4.4.4 scard(获取元素个数)

127.0.0.1:6379> smembers name
1) "sara"
2) "tom"
3) "jack"
127.0.0.1:6379> spop name
"jack"
127.0.0.1:6379> scard name
(integer) 2

4.4.5 smove(移动元素)

移动一个元素到另外一个集合。

127.0.0.1:6379> sadd name1 zhangsan
(integer) 1
127.0.0.1:6379> smove name name1 tom
(integer) 1
127.0.0.1:6379> smembers name1
1) "tom"
2) "zhangsan"

4.4.6 sunion (合并)

将两个集合合并为一个集合。

127.0.0.1:6379> smembers name1
1) "tom"
2) "zhangsan"
127.0.0.1:6379> sunion name name1
1) "tom"
2) "sara"
3) "zhangsan"
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值