Redis常用的一些功能

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis常用的一些功能 Redis的特性 : Strings:Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mget 等。

Redis常用的一些功能

Redis的特性 :

Strings:Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mget 等。 常用方法:

  1. 列表内容

    获取字符串长度
    往字符串append内容
    设置和获取字符串的某一段内容
    设置及获取字符串的某一位(bit)
    批量设置一系列字符串的内容

    Hashs:Redis Hash对应Value内部实际就是一个HashMap,常用命令:hget,hset,hgetall 等。

    Lists:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。 常用命令:lpush,rpush,lpop,rpop,lrange等。

    Sets:Sets 集合的概念就是一堆不重复值的组合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能。 常用命令:sadd,spop,smembers,sunion 等。

    Sorted Sets:Redis sorted set的使用场景与set类似,区别是set不是自动有序的。sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 常用命令:zadd,zrange,zrem,zcard等

计数:

Redis是一个很好的计数器,计数器是 Redis 的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向 Redis 发送一个 INCR 命令。使用场景比如网站的访问数,注册用户数,文章的点赞数,高并发的秒杀活动,分布式序列号生成等等统计计数的功能实现。Redis 解决这类计数问题得心应手,相比关系数据库速度更快,消耗资源更少。还可以通过set()方法来重置计数。

存值:这里这样存表示用于用于计数,不然会报错

stringRedisTemplate.opsForValue().set("test","testValue",10);
  /*计数功能*/


    @RequestMapping("/count")
    @ResponseBody
    public String count(){



        ValueOperations<String,String> opsForValues=Template.opsForValue();
        //没有计数前得到的是Value 存进去的testValue值
        System.out.println(opsForValues.get("test").equalsIgnoreCase("testValue"));
        for (int i = 4; i < 100; i++) {
            //计数,第一个参数为key值,第二个参数为每次增加计数的单位
            //计数的开始的值是0
            opsForValues.increment("test", 1);
        }
        //开始计数后得到的是计数
        System.out.println(opsForValues.get("test")); //100

        return "ok";


    }

时间计数

有时候除了简单的计数外,比如注册用户数需要按日统计,处理方法比较简单,把日期带入计数器 key 就可以。以此类推,还可以按其他方式进行统计计数,只需要把统计的方式添加到key值就可以了

@RequestMapping("/count2")
    @ResponseBody
    public String count2(){


        String key="test_"+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        ValueOperations<String,String> opsForValues=Template.opsForValue();
        //没有计数前得到的是Value 存进去的testValue值
        System.out.println(opsForValues.get(key));
        for (int i = 0; i < 100; i++) {
            //计数,第一个参数为key值,第二个参数为每次增加计数的单位
            //不管
            opsForValues.increment(key, 1);
        }
        //开始计数后得到的是计数
        System.out.println(opsForValues.get(key)); //100

        return "ok";


    }

按模糊Key值查询

在按条件统计计数的时候,把时间加入到了key值中,有时候要只是查询某个对象的统计数时,就可以使用模糊Key值查询。


    @RequestMapping("/like")
    @ResponseBody
    public String like(){

     ValueOperations<String,String> opsForValues=Template.opsForValue();
        //前缀是user的key集合
        Set<String> set=Template.keys("use*");
        for (String s:set) {
            String str=opsForValues.get(s);
            //输出每个key的value
        }

        return "ok";

    }

使用hashs存储获取修改java对象

在实际开发中,我们经常将一些结构化的信息打包成HashMap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。

而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。因为Redis的Hash结构是以对象的名字作为redis的key值,以对象的唯一属性值作为hash的key值,以对象来作为redis的value值

 @RequestMapping("/testHash")
    @ResponseBody
    public String testHash(){
        User user=new User(1,"tom","123");
        User user1=new User(2,"tom","123");
        HashOperations<String,Object,Object> hashOperations=Template.opsForHash();
        //把user=1的值改变
        hashOperations.put("test",user.getId(),user1);


        return "ok";

    }

使用lists有序存储读取

用于获取最近N个操作的数据。

    @RequestMapping("/testList")
    @ResponseBody
    public String testList(){
        //存储有序
         ListOperations<String,String> listOperations=Template.opsForList();
         listOperations.leftPush("a","1");
         listOperations.leftPush("a","2");
         listOperations.leftPush("a","3");
         listOperations.leftPush("a","4");
         listOperations.leftPush("a","5");
         listOperations.leftPush("a","6");
         //保留5个key-value
         listOperations.trim("a",0,4); //[6, 5, 4, 3, 2]
         System.out.println(listOperations.range("a",0,listOperations.size("a")-1));
         //
         return "ok";

    }

使用sets存储读取 无序 去重 求差集,交集,并集

//使用set存储读取 无序 去重 求差集,交集,并集

 @RequestMapping("/testSet")
    @ResponseBody
    public String testSet(){
        SetOperations<String,String> set=Template.opsForSet();
        set.add("test7_1", "2", "1","2","3","4","4","3");
        set.add("test7_2", "2", "6","2","3","7","6","5");
        System.out.println("全部成员"+set.members("test7_1"));
        System.out.println("差集"+set.difference("test7_1", "test7_2"));
        System.out.println("交集"+set.intersect("test7_1", "test7_2"));
        System.out.println("并集"+set.union("test7_1", "test7_2"));
        return "ok";

    }

Sorted Set 存取数据 排序

//Sorted Set 存取数据 排序 相比sets 保存时多一个权重参数score,相当于按照此参数来排序


    @RequestMapping("/testzSet")
    @ResponseBody
    public String testzSet(){
        ZSetOperations<String, String> zSet = Template.opsForZSet();
        zSet.add("test8", "use1", 9);
        zSet.add("test8", "use2", 1);
        zSet.add("test8", "use3", 5);
        zSet.add("test8", "use4", 9);
        //对应的score值增加
        //zSet.incrementScore("test8", "use1", 1);
        System.out.println(zSet.reverseRange("test8", 0, zSet.size("test8")-1));
        //输出[use4, use1, use3, use2] 从高到低的顺序
        return "ok";

    }
原文地址
http://www.bieryun.com/3732.html
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
11天前
|
存储 NoSQL PHP
如何用Redis高效实现点赞功能?用Set?还是Bitmap?
在众多软件应用中,点赞功能几乎成为标配。本文从实际需求出发,探讨如何利用 Redis 的 `Set` 和 `Bitmap` 数据结构设计高效点赞系统,分析其优缺点,并提供 PHP 实现示例。通过对比两种方案,帮助开发者选择最适合的存储方式。
25 3
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
25 2
|
5月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
227 0
|
5月前
|
缓存 NoSQL Java
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
277 0
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
58 2
|
3月前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
|
3月前
|
存储 缓存 监控
【Azure Redis 缓存】Azure Redis 功能性讨论二
【Azure Redis 缓存】Azure Redis 功能性讨论二
【Azure Redis 缓存】Azure Redis 功能性讨论二
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】Azure Redis功能性讨论
【Azure Redis 缓存】Azure Redis功能性讨论