使用redis的准备工作
1、在虚拟机上安装redis(前提是安装了docker容器)
上面使用到的命令
docker pull redis
mkdir -p /mydata/redis/conf
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
2、修改reids.conf配置文件让redis中的数据持久化
同上mysql配置文件一样,输入appendonly yes后保存
最后重启redis
这样redis的数据就从内存中存到了磁盘中
3、常用操作
(1)使用redis 镜像执行redis-cli 命令连接
进到了redis容器内部
docker exec -it redis redis-cli
4、添加redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
5、application.properties配置文件里配置redis主机地址
spring.redis.host=192.168.241.128
本商城项目哪里用到了redis
秒杀服务
1、秒杀服务中定时上架秒杀商品的uploadSeckillSkuLatest3Days方法的实现中用到
(1)注入StringRedisTemplate (其实就是java中操作redis的类)
@Autowired
private StringRedisTemplate redisTemplate;
(2)定义了三个存入redis的前缀
//秒杀活动的前缀
private final String SESSION__CACHE_PREFIX = "seckill:sessions:";
//秒杀商品的前缀
private final String SECKILL_CHARE_PREFIX = "seckill:skus";
//秒杀库存的前缀
private final String SKU_STOCK_SEMAPHORE = "seckill:stock:"; //+商品随机码
(3)常用的操作
1>判断redis中有没有这个key,有就返回true,没有就返回false
Boolean hasKey = redisTemplate.hasKey(key);
2> 以集合的方式向左边批量添加元素(其实就是给指定的key值批量添加多个value值)
redisTemplate.opsForList().leftPushAll(key,skuIds);
3>给redis中HashMap结构的Hash值绑定操作(也就是以后根据这个Hash值来增删改查)
//SECKILL_CHARE_PREFIX=seckill:skus(seckill:skus就是Hash值)
BoundHashOperations<String, Object, Object> operations =
redisTemplate.boundHashOps(SECKILL_CHARE_PREFIX);
4>HashMap结构存入redis缓存和取出key对应的value值
//HashMap结构存入redis缓存
operations.put(key,value);
//HashMap结构取出key对应的value值
String skuInfoValue = hashOps.get(key);
5> 模糊获取所有的keys
//从Redis中查询到所有key以seckill:sessions开头的所有数据
//(其实就是查找所有redis里的秒杀活动的信息)
Set<String> keys = redisTemplate.keys(SESSION__CACHE_PREFIX + "*");
6> 取出这个key对应的所有值
//2、获取这个秒杀场次需要的所有商品信息也就是key对应的value(这个key是当前秒杀活动的key)
//-100到100表示取出所有的key对应的值
List<String> range = redisTemplate.opsForList().range(key, -100, 100);
7> 根据多个key来获取多个key对应的值
//这个keys是List<String>集合
List<String> listValue = hasOps.multiGet(keys);
8>具体对象和Json字符串互转(注意这里是需要导入下面的依赖才能用)
//把Json字符串转为具体的对象
具体对象 具体对象实例 = JSON.parseObject(Json字符串, 具体对象.class);
//下面是把items的Json字符串转为SeckillSkuRedisTo对象
例如: SeckillSkuRedisTo redisTo = JSON.parseObject(items, SeckillSkuRedisTo.class);
//把具体对象转为Json字符串(redisTo是具体对象的实例)
String seckillValue = JSON.toJSONString(redisTo);
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
<scope>compile</scope>
</dependency>
9>setIfAbsent方法
//setIfAbsent方法如果为空就set值,并返回1,如果存在(不为空)不进行操作,并返回0
Boolean aBoolean = redisTemplate.opsForValue()
.setIfAbsent(key, value, 超时时间, TimeUnit.MILLISECONDS);