技术栈入门——-Redis

  • Post author:
  • Post category:其他


使用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);



版权声明:本文为qq_50954361原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。