Redis的使用

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的使用

1:简介

1.1:Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件,它存储的value类型比较丰富,也被称为结构化的NoSql数据库(非关系型数据库)。

1.2:Redis应用场景

  • 缓存
  • 任务队列
  • 消息队列
  • 分布式锁

2:Redis 5种常用数据类型

2.1:string 普通字符串

常用命令:

  • SET key value:设置指定key的值
  • GET kry:获取指定key的值
  • SETEX key seconds value:设置指定key的值,并将key的过时时间设置为seconds秒
  • SETNX key value:只有在key不存在时设置key的值

2.2:hash适合存储对象

Redis hash是一个string类型的field和value的映射表,适合存储对象

  • HSET key field value:将哈希表key中的字段field的值设置为key
  • HGET key field:获取存储在哈希表中指定字段的值
  • HDEL key field:删除存储在哈希表中的指定字段
  • HKEYS key:获取哈希表中所有字段
  • HVALS key:获取哈希表中所有值
  • HGETALL key:获取在哈希表中指定key的所有字段和值

2.3:列表list,按照插入顺序进行排序,可以有重复元素

  • LPUSH key value1 [value2]将一个或多个值插入到列表头部
  • LRANG key start stop:获取列表指定范围内的元素
  • RPOP key:移除并获取列表最后一个元素
  • LLEN key:获取列表长度
  • BRPOP key1 [key2] timeout:移出并获取列表最后一个元素,如果列表没有元素会阻塞队列直到等待超时或者发现可弹出元素为止。

2.4:集合set,无序,没有重复元素

  • SADD key member1 [member2]:向集合中添加一个或多个成员
  • SMEMBERS key:返回集合中的所有成员
  • SCARD key:获取集合的成员数
  • SINTER key1 [key2]:返回给定所有集合的交集
  • SUNION key1 [key2]:返回所有给定集合的并集
  • SDIFF key1 [key2]:返回给定所有集合的差集
  • SREM key member1 [member2]:移除集合中一个或者多个成员

2.5:有序集合sorted set,没有重复元素

  • ZADD key score1 member1 [score2 member2] 向有序集合中添加一个或多个成员,或者更新已存在成员的分数
  • ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member:有序集合中对指定成员的分数加上增量increment
  • ZREM key member [member …]:移除有序集合中的一个或者多个成员

2.6:通用命令

  • KEYS pattern:查找所有符合给定模式(pattern)的key
  • EXISTS key:检查给定key是否存在
  • TYPE key:返回key所存储的类型
  • TTL key:返回给定key的剩余生存时间(time to live),以秒为单位
  • DEL key:该命令用于在key存在时删除key

3:Java中使用Redis

3.1:导入坐标,配置相关文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    jedis:
      pool:
        max-active: 8 #最大连接数
        max-wait: 1ms #连接池最大阻塞等待时间
        max-idle: 4  #连接池中的最大空闲连接
        min-idle: 0  #连接池中的最小空闲连接

3.2:Spring Data Redis

Spring Data Redis中提供了一个高度封装的类:RedisTemplate、StringRedisTemplate,真针对jedis客户端中大量的api进行了归类封装,将同一类型操作封装为operation接口。RedisTemplate和StringRedisTemplate两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。他们的主要区别在于使用的序列化类上,RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。StringRedisTemplate使用的是StringRedisSerializer。如果要存储的是字符串,则使用StringRedisTemplate,如果要存储复杂的对象类型,则使用RedisTemplate。具体分类如下:

@SpringBootTest
class ApplicationTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 普通字符串类型
     */
    @Test
    void StringTest() {
        //普通字符串类型
        //设置键值
        stringRedisTemplate.opsForValue().set("username","zhangsan");
        String username = stringRedisTemplate.opsForValue().get("username");
        System.out.println(username);
        //存入数据并设置过期时间
        stringRedisTemplate.opsForValue().set("password","asd123",10, TimeUnit.SECONDS);
    }
    /**
     * 哈希类型
     */
    @Test
    void HashTest(){
        HashOperations<String, String, String> opsForHash = stringRedisTemplate.opsForHash();
        opsForHash.put("user","name","zhangsan");
        opsForHash.put("user","age","20");
        opsForHash.put("user","addr","beijing");
        //取值
        String name = (String) stringRedisTemplate.opsForHash().get("user", "name");
        System.out.println(name);
        // 获取所有字段
        for (Object user : opsForHash.keys("user")) {
            System.out.println(user);
        }
        //获取所有值
        List<Object> user = Collections.singletonList(opsForHash.values("user"));
        for (Object s : user) {
            System.out.println(s);
        }
    }
    /**
     * List操作
     */
    @Test
    void ListTest(){
        ListOperations<String, String> opsForList = stringRedisTemplate.opsForList();
        opsForList.leftPush("age","20");
        opsForList.leftPushAll("age","30","40","50");
        //获取所有值
        List<String> age = opsForList.range("age", 0, -1);
        assert age != null;
        for (String s : age) {
            System.out.println(s); //50 40 30 20
        }
        //出队列
        Long size = opsForList.size("age");
        assert size != null;
        int len = size.intValue();
        for (int i = 0; i < len; i++) {
            //出队列
            String Age = opsForList.rightPop("age");
            System.out.println(Age);
        }
    }
    /**
     * 集合操作
     */
    @Test
    void setTest(){
        SetOperations<String, String> opsForSet = stringRedisTemplate.opsForSet();
        //添加元素
        opsForSet.add("age","20","20","30","40");
        //取值
        for (String age : Objects.requireNonNull(opsForSet.members("age"))) {
            System.out.println(age);   //20 30 40
        }
        System.out.println("---------------------------");
        //删除成员
        opsForSet.remove("age","30");
        Set<String> age = opsForSet.members("age");
        assert age != null;
        for (String s : age) {
            System.out.println(s);  //20 40
        }
    }
    /**
     * ZSet有序集合
     */
    @Test
    void ZSetTest(){
        ZSetOperations<String, String> opsForZSet = stringRedisTemplate.opsForZSet();
        //添加元素
        opsForZSet.add("myZSet","age1",10);
        opsForZSet.add("myZSet","age2",20);
        opsForZSet.add("myZSet","age3",30);
        opsForZSet.add("myZSet","age1",10);
        //取值
        Set<String> myZSet = opsForZSet.range("myZSet", 0, -1);
        assert myZSet != null;
        for (String s : myZSet) {
            System.out.println(s);   //age1 age2 age3
        }
        System.out.println("----------------------");
        //修改
        opsForZSet.incrementScore("myZSet","age1",30);
        for (String zSet : Objects.requireNonNull(opsForZSet.range("myZSet", 0, -1))) {
            System.out.println(zSet);   //age2 age3 age1
        }
        System.out.println("---------------------");
        //删除
        opsForZSet.remove("myZSet","age1","age2");
        for (String zSet : Objects.requireNonNull(opsForZSet.range("myZSet", 0, -1))) {
            System.out.println(zSet);  //age3
        }
    }
    /**
     * 通用操作
     */
    @Test
    void commonTest(){
        //获取Redis中所有的key
        for (String key : Objects.requireNonNull(stringRedisTemplate.keys("*"))) {
            System.out.println(key);
        }
        System.out.println("--------------------");
        //检查指定key是否存在
        Boolean isExists = stringRedisTemplate.hasKey("username");
        System.out.println(isExists);
        System.out.println("--------------------");
        //删除指定key
        stringRedisTemplate.delete("username");
        //获取指定key对应的value数据类型
        DataType myZSet = stringRedisTemplate.type("myZSet");
        System.out.println(myZSet.name());
    }
}
相关实践学习
基于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
相关文章
|
4天前
|
存储 NoSQL 关系型数据库
【初识Redis】
【初识Redis】
23 2
|
8月前
|
存储 NoSQL Redis
|
4天前
|
存储 消息中间件 缓存
redis
Redis是一个开源的内存数据库,它可以用作缓存、消息队列和持久化存储等多种用途。
33 0
|
7月前
|
NoSQL Redis
06Redis - Redis的使用
06Redis - Redis的使用
36 0
|
8月前
|
缓存 NoSQL 关系型数据库
|
9月前
|
消息中间件 NoSQL 测试技术
Redis2
Redis2
92 0
|
NoSQL Java Redis
|
NoSQL Redis
|
存储 缓存 监控
Redis应用问题解决
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
Redis应用问题解决
|
存储 缓存 NoSQL
redis为什么这么快?
redis为什么这么快?