redis真实使用

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:string数据操作

  • SetOperations:set类型数据操作

  • ZSetOperations:zset类型数据操作

  • HashOperations:hash类型的数据操作

  • ListOperations:list类型的数据操作

  • GeoOperations: geo地址位置数据类型的操作

  • HyperLogLogOperations: HyperLogLog基数类型的操作

  • ValueOperations:bitmap数据操作(bitmap的本质还是基于string类型的value)

  • 字符串(string):普通字符串,Redis中最简单的数据类型

  • 哈希(hash):也叫散列,类似于Java中的HashMap结构

  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList

  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet

  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

	/**
     * 操作字符串类型的数据
     */
    @Test
    public void testString(){
        // set get setex setnx
        redisTemplate.opsForValue().set("name","小明");
        String city = (String) redisTemplate.opsForValue().get("name");
        System.out.println(city);
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
        redisTemplate.opsForValue().setIfAbsent("lock","1");
        redisTemplate.opsForValue().setIfAbsent("lock","2");
    }
	/**
     * 操作哈希类型的数据
     */
    @Test
    public void testHash(){
        //hset hget hdel hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();

        hashOperations.put("100","name","tom");
        hashOperations.put("100","age","20");

        String name = (String) hashOperations.get("100", "name");
        System.out.println(name);

        Set keys = hashOperations.keys("100");
        System.out.println(keys);

        List values = hashOperations.values("100");
        System.out.println(values);

        hashOperations.delete("100","age");
    }
/**
     * 操作列表类型的数据
     */
    @Test
    public void testList(){
        //lpush lrange rpop llen
        ListOperations listOperations = redisTemplate.opsForList();

        listOperations.leftPushAll("mylist","a","b","c");
        listOperations.leftPush("mylist","d");

        List mylist = listOperations.range("mylist", 0, -1);
        System.out.println(mylist);

        listOperations.rightPop("mylist");

        Long size = listOperations.size("mylist");
        System.out.println(size);
    }
/**
     * 操作集合类型的数据
     */
    @Test
    public void testSet(){
        //sadd smembers scard sinter sunion srem
        SetOperations setOperations = redisTemplate.opsForSet();

        setOperations.add("set1","a","b","c","d");
        setOperations.add("set2","a","b","x","y");

        Set members = setOperations.members("set1");
        System.out.println(members);

        Long size = setOperations.size("set1");
        System.out.println(size);

        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);

        Set union = setOperations.union("set1", "set2");
        System.out.println(union);

        setOperations.remove("set1","a","b");
    }
	/**
     * 操作有序集合类型的数据
     */
    @Test
    public void testZset(){
        //zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        zSetOperations.add("zset1","a",10);
        zSetOperations.add("zset1","b",12);
        zSetOperations.add("zset1","c",9);

        Set zset1 = zSetOperations.range("zset1", 0, -1);
        System.out.println(zset1);

        zSetOperations.incrementScore("zset1","c",10);

        zSetOperations.remove("zset1","a","b");
    }
操作Geospatial地理位置类型**
@Test
public void geoTest(){
    GeoOperations geoOperations = redisTemplate.opsForGeo();
    geoOperations.add("location",new Point(114.400,40.121),"shop");
    geoOperations.add("location",new Point(114.400,40.122),"shop2");

    List position = geoOperations.position("location", "shop");
    System.out.println(position);
}
操作HyperLogLog基数统计类型**
@Test
public void loglogTest(){
    HyperLogLogOperations logOptions = redisTemplate.opsForHyperLogLog();
    logOptions.add("userIds","a","b","c","d");


    Long total = logOptions.size("userIds");
    System.out.println("访客数:"+total);
}
操作bitmap二进制位类型**
@Test
public void stringTest(){

    ValueOperations stringOptions = redisTemplate.opsForValue();
    //bitmap操作
    stringOptions.setBit("bitmap",50,true);

    Boolean bool = stringOptions.getBit("bitmap", 50);
    System.out.println(bool);

}
/**
     * 根据类型查询分类
     * @param type
     * @return
     */
    @Autowired
    private RedisTemplate redisTemplate;
    public List<Category> list(Integer type) {
        //  添加redis缓存
        List<Category> list =  (List<Category>)redisTemplate.opsForValue().get(RedisConstant.CATEGORY_LIST+type);
        if(list==null||list.size()==0) {
            list = categoryMapper.list(type);
            redisTemplate.opsForValue().set(RedisConstant.CATEGORY_LIST+type,list);
        }
        return list;
    }
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 设置店铺的营业状态
     * @param status
     * @return
     */
    @PutMapping("/{status}")
    @ApiOperation("设置店铺的营业状态")
    public Result setStatus(@PathVariable Integer status){
        log.info("设置店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
        redisTemplate.opsForValue().set(KEY,status);
        return Result.success();
    }
}
	/**
     * 获取店铺的营业状态
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
        return Result.success(status);
    }
@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取店铺的营业状态
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
        return Result.success(status);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Redis 在 Java Web 中的一个实际使用例子。 假设我们有一个在线商城,需要实现商品的浏览量统计功能。我们可以使用 Redis 来实现这个功能,具体步骤如下: 1. 引入 Redis 相关依赖 在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.3</version> </dependency> ``` 2. 创建 Redis 连接池 在 Java Web 中,为了提高 Redis 连接的效率,我们通常会使用连接池。可以使用 JedisPool 工具类来创建 Redis 连接池: ```java public class RedisUtil { private static JedisPool jedisPool = null; static { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(10); jedisPool = new JedisPool(config, "localhost", 6379); } public static Jedis getJedis() { return jedisPool.getResource(); } public static void close(Jedis jedis) { if (jedis != null) { jedis.close(); } } } ``` 3. 实现商品浏览量统计功能 我们可以使用 Redis 的 incr 命令来实现商品浏览量的统计。具体实现代码如下: ```java public class ProductDao { public void increaseViewCount(String productId) { Jedis jedis = null; try { jedis = RedisUtil.getJedis(); jedis.incr("product:" + productId + ":view"); } finally { RedisUtil.close(jedis); } } } ``` 在浏览商品时,调用 increaseViewCount 方法来增加商品的浏览量: ```java public class ProductController { private ProductDao productDao = new ProductDao(); public void viewProduct(String productId) { // 显示商品信息 productDao.increaseViewCount(productId); } } ``` 4. 获取商品浏览量 我们可以使用 Redis 的 get 命令来获取商品的浏览量。具体实现代码如下: ```java public class ProductDao { public Long getViewCount(String productId) { Jedis jedis = null; try { jedis = RedisUtil.getJedis(); String viewCount = jedis.get("product:" + productId + ":view"); return Long.parseLong(viewCount); } finally { RedisUtil.close(jedis); } } } ``` 在显示商品信息时,调用 getViewCount 方法来获取商品的浏览量: ```java public class ProductController { private ProductDao productDao = new ProductDao(); public void viewProduct(String productId) { // 显示商品信息 Long viewCount = productDao.getViewCount(productId); // 显示商品浏览量 System.out.println("商品浏览量:" + viewCount); } } ``` 以上就是 Redis 在 Java Web 中的一个实际使用例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值