因为商城项目使用的是微服务的架构,比如产品服务、订单服务、物流服务等等,不同的服务可能会部署在不同的电脑上,以前我们优化查询是用过缓存实现的,即将用户所需要访问的数据,在用户第一次查询的时候,就进入数据库进行查询,然后将所有的数据存放到缓存中,之后用户若再次访问就直接从内存中进行获取,不需要再访问数据库,这在性能上面优化了。并且当出现并发的情况时,比如:几千个用户同时访问同一个资源,这会给数据库或内存造成很大的压力。
但是分布式架构出现,以前的缓存的方式就不适用了,因为不同的计算机是不共享内存的,解决方案就是,再起一个缓存服务,作为中央缓存,用户直接通过路由网关,访问中央缓存内的数据。
技术选型:
选择Reids实现中央缓存,因为其数据存放在内存中,并且数据会不定期持久化到硬盘内,可以保证数据的安全性,且其支持存储的数据类型也比较多(比如String、List、Set 、HashSet),支持跨语言(客户端的选择,有利于发展)、支持超大并发,可以实现集群。
(一)Redis知识储备
服务端:
(扩展:redis使用的是C语言编写的,Redis官方提供的就是C语言,C语言原生就是在Linux上面运行的,没有提供windows版,window上面不能直接运行,需要进行编译,所以微软编译成为了exe文件)
使用redis,需要先安装服务端:
window:下载微软编译的压缩版,解压直接运行
① 结构分析
logs //日志存放目录
redis.conf //配置文件
redis-benchmark.exe //性能测试工具
redis-check-aof.exe //检测持久化数据是否完好
redis-check-dump.exe //检测持久化数据是否完好
redis-cli.exe //客户端
redis-server.exe //服务端
② 启动redis服务(以命令行客户端启动为例)
带配置文件:redis-server.exe redis.conf
不带配置文件:直接双击 redis-server.exe
默认启动:redis-cli.exe 默认连接本机127.0.0.1、默认端口6379服务
指定Ip和端口启动: redis -cli -h i地址 -p 端口号
例如:redis -cli -h 172.16.0.15 -p 6380
③ 基本用法
set key value//将字符串值value关联到key
get key //返回key关联的字符串值
mset //同时设置一个或多个 key-value 对
mget //返回所有(一个或多个)给定 key 的值
incr key //将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
decr key //将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
incrBy key num//自增多少
decrBy key num//自减多少
keys * //获取所有key列表
del key //删除key
expire key xx //设置key的过期时间(xx秒后过期)
ttl key //查看key的过期时间
select 0-15 选择库 默认16个数据库
flushall //清空整个redis服务器数据,所有的数据库全部清空
flushdb //清除当前库,redis中默认有16个数据库,名称分别为0,1,2.。。15
lpush key value //将一个或多个值 value 插入到列表 key 的表头(最左边)
rpush key value //将一个或多个值 value 插入到列表 key 的表尾(最右边
lpop key //移除并返回列表 key 的头(最左边)元素。
rpop key //移除并返回列表 key 的尾(最右边)元素。
lrange key start stop//返回列表 key 中指定区间内的元素,查询所有的stop为-1即可
lrem key count value//根据count值移除列表key中与参数 value 相等的元素 count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lindex key index //返回列表 key 中,下标为 index 的元素
ltrim key start stop //对一个列表进行修剪
set集合是一个无序的不含重复值的队列
sadd key member //将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
srem key member//移除集合 key 中的一个或多个 member 元素&#