关于Redis的一些场景使用,大家共同学习

步骤

1.添加依赖

<!--redis依赖配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.配置yml

spring:
	 redis:
	    host: localhost # Redis服务器地址
	    database: 0 # Redis数据库索引(默认为0)
	    port: 6379 # Redis服务器连接端口
	    password: # Redis服务器连接密码(默认为空)
	    jedis:
	      pool:
	        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
	        max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
	        max-idle: 8 # 连接池中的最大空闲连接
	        min-idle: 0 # 连接池中的最小空闲连接
	    timeout: 3000ms # 连接超时时间(毫秒)

3.直接上代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @description: Redis
 * @author: fun
 * @create: 2020-04-01 15:19
 */
@Controller
@RequestMapping("/app")
public class RedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping(value = "/a", method = RequestMethod.GET)
    public void test() {

        stringRedisTemplate.opsForValue().set("user1001", "1");
        System.out.println("setIfAbsent:" + stringRedisTemplate.opsForValue().get("user1001"));
        //setIfAbsent set一个key,如果存在则返回false
        Boolean setIfAbsent = stringRedisTemplate.opsForValue().setIfAbsent("user1001", "2");
        System.out.println("setIfAbsent,user1001:" + setIfAbsent);
        //setIfAbsent set一个key,如果存在则返回true
        setIfAbsent = stringRedisTemplate.opsForValue().setIfAbsent("user1002", "2");
        System.out.println("setIfAbsent,user1002:" + setIfAbsent);

        //multiSet 批量set
        Map<String, String> map = new HashMap<>();
        map.put("user1003", "2");
        map.put("user1004", "2");
        map.put("user1005", "2");
        stringRedisTemplate.opsForValue().multiSet(map);
        List<String> listMulti = stringRedisTemplate.opsForValue().multiGet(map.keySet());
        System.out.println("multiGet:" + listMulti.toString());

        //multiSetIfAbsent  批量set, 同理setIfAbsent
        Map<String, String> mapIfAbsent = new HashMap<>();
        mapIfAbsent.put("user1003", "2");
        mapIfAbsent.put("user1006", "6");
        Boolean multiSetIfAbsent = stringRedisTemplate.opsForValue().multiSetIfAbsent(mapIfAbsent);
        System.out.println("multiSetIfAbsent:" + multiSetIfAbsent);

        //increment 设置对应的Value值每次递增,默认为1 (分布式下可以用来生成唯一id)
        stringRedisTemplate.opsForValue().increment("user1005");
        System.out.println("user1005:" + stringRedisTemplate.opsForValue().get("user1005"));
        stringRedisTemplate.opsForValue().increment("user1005", 2);
        System.out.println("user1005:" + stringRedisTemplate.opsForValue().get("user1005"));

        /**
         *opsForHash 可以用来实现购物车功能
         * 添加商品put
         * 添加数量increment
         * 查看列表entries或scan
         * 查看长度lengthOfValue
         * 删除商品delete
         */
        stringRedisTemplate.opsForHash().put("cart1001", "10088", "1");
        stringRedisTemplate.opsForHash().put("cart1001", "10089", "1");
        stringRedisTemplate.opsForHash().put("cart1001", "10090", "1");
        stringRedisTemplate.opsForHash().put("cart1001", "10091", "1");
        Map<Object, Object> mapEntries = stringRedisTemplate.opsForHash().entries("cart1001");
        for (Map.Entry<Object, Object> entry : mapEntries.entrySet()) {
            System.out.println("Hash-entries:" + entry.getKey() + ":" + entry.getValue());
        }
        Long length = stringRedisTemplate.opsForHash().lengthOfValue("cart1001", "10088");
        System.out.println("Hash-length:" + length);
        Long increment = stringRedisTemplate.opsForHash().increment("cart1001", "10088", 1);
        System.out.println("Hash-increment:" + increment);
        Cursor<Map.Entry<Object, Object>> cursor = stringRedisTemplate.opsForHash().scan("cart1001", ScanOptions.NONE);
        while (cursor.hasNext()) {
            Map.Entry<Object, Object> entry = cursor.next();
            System.out.println("Hash-cursor-scan:" + entry.getKey() + ":" + entry.getValue());
        }
        stringRedisTemplate.opsForHash().delete("cart1001", "10088");
        mapEntries = stringRedisTemplate.opsForHash().entries("cart1001");
        for (Map.Entry<Object, Object> entry : mapEntries.entrySet()) {
            System.out.println("Hash-entries-delete:" + entry.getKey() + ":" + entry.getValue());
        }
        /**
         * opsForList 对数据进行有序的操作 可以实现站内消息功能
         * leftPush 对用户的消息列表左边添加消息
         * rightPush 对用户的消息列表右边添加消息
         * leftPop 删除用户的消息列表最左边的一条消息
         * rightPop 删除用户的消息列表最右边的一条消息
         * range 分页获取这个用户的消息(start, end))
         */
        stringRedisTemplate.opsForList().leftPush("user2001", "message002");
        stringRedisTemplate.opsForList().leftPush("user2001", "message001");
        List<String> listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
        System.out.println("listRange:" + listRange.toString());
        stringRedisTemplate.opsForList().rightPush("user2001", "message003");
        stringRedisTemplate.opsForList().rightPush("user2001", "message004");
        listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
        System.out.println("listRange:" + listRange.toString());

        stringRedisTemplate.opsForList().leftPop("user2001");
        listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
        System.out.println("listRange:" + listRange.toString());

        stringRedisTemplate.opsForList().rightPop("user2001");
        listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
        System.out.println("listRange:" + listRange.toString());

        stringRedisTemplate.opsForList().remove("user2001", 1, "message003");
        listRange = stringRedisTemplate.opsForList().range("user2001", 0, 2);
        System.out.println("listRange:" + listRange.toString());

        /**
         * opsForSet 用来实现抽奖功能
         * add 添加用户 key:奖池名 value:用户id
         * members 查看奖池用户
         * distinctRandomMembers 抽出中奖用户,但是不删除
         * pop 抽出中奖用户,并删除中奖用户
         */
        Long countSet = stringRedisTemplate.opsForSet().add("lottery", "1001");
        System.out.println("countSet:" + countSet);
        countSet = stringRedisTemplate.opsForSet().add("lottery", "1002");
        System.out.println("countSet:" + countSet);
        countSet = stringRedisTemplate.opsForSet().add("lottery", "1001", "1003", "1004", "1005");
        System.out.println("countSet:" + countSet);
        Set<String> setMembers = stringRedisTemplate.opsForSet().members("lottery");
        System.out.println("setMembers:" + setMembers.toString());
        Set<String> distinctRandomMembers = stringRedisTemplate.opsForSet().distinctRandomMembers("lottery", 2);
        System.out.println("distinctRandomMembers:" + distinctRandomMembers.toString());
        System.out.println("distinctRandomMembers后的list:" + stringRedisTemplate.opsForSet().members("lottery").toString());
        List<String> pop = stringRedisTemplate.opsForSet().pop("lottery", 2);
        System.out.println("set-pop:" + pop.toString());
        System.out.println("set-pop后的list:" + stringRedisTemplate.opsForSet().members("lottery").toString());
        /**
         * opsForSet 用来实现点赞,收藏等功能
         * add 点赞 key:点赞主体(如文章id) value:用户id
         * members 查看所有点赞用户
         * remove 取消点赞
         * isMember 检查是否点赞过
         * 获取点赞数
         */
        stringRedisTemplate.opsForSet().add("article1001", "1001", "1002", "1003", "1004", "1005");
        Set<String> members = stringRedisTemplate.opsForSet().members("article1001");
        System.out.println("members:" + members.toString());
        Long countSetRem = stringRedisTemplate.opsForSet().remove("article1001", "1001");
        System.out.println("countSetRem:" + countSetRem);
        Boolean isMember= stringRedisTemplate.opsForSet().isMember("article1001","1001");
        System.out.println("isMember-1001:" + isMember);
        isMember= stringRedisTemplate.opsForSet().isMember("article1001","1002");
        System.out.println("isMember-1002:" + isMember);
        Long countAll = stringRedisTemplate.opsForSet().size("article1001");
        System.out.println("countAll:" + countAll);

        /**
         * opsForSet 可以实现好友中的共同关注,可能认识的人,我关注的人也关注了他
         */
        stringRedisTemplate.opsForSet().add("1001", "1002", "1003", "1004", "1005");
        stringRedisTemplate.opsForSet().add("1002",   "1003", "1004", "1005","1006","1007");
        Set<String> difference= stringRedisTemplate.opsForSet().difference("1001", "1002");
        Set<String> union= stringRedisTemplate.opsForSet().union("1001","1002");
        Set<String> intersect= stringRedisTemplate.opsForSet().intersect("1001","1002");
        System.out.println("difference两个key的差:" + difference);
        System.out.println("union两个key的合集:" + union);
        System.out.println("intersect两个key的交集:" + intersect);
        isMember= stringRedisTemplate.opsForSet().isMember("1002","1003");
        System.out.println("isMember我关注的人也关注了他:" + isMember);

 /**
         * opsForZSet 排行榜
         */
        stringRedisTemplate.opsForZSet().incrementScore("shop001", "card1", 1);
        //加法操作
        stringRedisTemplate.opsForZSet().incrementScore("shop001", "card1", 1);
        //减法操作
        stringRedisTemplate.opsForZSet().incrementScore("shop001", "card1", -1);
        stringRedisTemplate.opsForZSet().incrementScore("shop001", "card2", 1);
        stringRedisTemplate.opsForZSet().incrementScore("shop001", "card2", 1);
        stringRedisTemplate.opsForZSet().incrementScore("shop001", "card3", 1);
        stringRedisTemplate.opsForZSet().incrementScore("shop002", "card1", 1);
        Set<String> range =stringRedisTemplate.opsForZSet().reverseRange("shop001", 0,0);
        System.out.println("获取门店shop001使用优惠劵TOP1:" + JSON.toJSONString(range));
        Set<ZSetOperations.TypedTuple<String>> rangeWithScores = stringRedisTemplate.opsForZSet().reverseRangeWithScores("shop001", 0, 0);
        System.out.println("获取门店shop001使用优惠劵TOP1列表:" + JSON.toJSONString(rangeWithScores));
        Long rankNum = stringRedisTemplate.opsForZSet().reverseRank("shop001", "card1");
        System.out.println("获取门店shop001中优惠劵card1排名:" + rankNum);
        Double score = stringRedisTemplate.opsForZSet().score("shop001", "card1");
        System.out.println("获取门店shop001中优惠劵card1使用张数:" + score);
        Long count = stringRedisTemplate.opsForZSet().count("shop001", 2, 2);
        System.out.println("统计门店shop001中 使用优惠劵2次的优惠劵数量:" + count);
     
    }
}