Redis入门,Idea操作Redis

一、Redis是什么?

Redis(Remote Dictionary Server,远程字典服务器)是一个开源的高性能键值对(key-value)数据库。它以其出色的性能、可靠性和灵活性而闻名,常用于开发中来实现多种数据存储和通信模式

二、为什么要学习redis

内存中数据库:Redis主要将数据存储在内存中,这使得读写操作非常快速

支持多种数据类型:Redis支持多种类型的数据存储,包括字符串(strings)、列表(lists)、集合(sets)、有序集合(sorted sets)、散列(hashes)、位图(bitmaps)、超日志(hyperloglogs)等

持久化:尽管Redis是内存数据库,但它提供了持久化机制,可以将内存中的数据保存到磁盘,防止数据丢失

丰富的特性:Redis提供了发布/订阅、事务、Lua脚本、慢查询日志、监视器等高级功能

三、redis的基本数据类型

  1. 字符串(String)

    • 简单的键值对存储,适合存储单个数据点。
    • 图解:key: "value"
    • 命令:设置值:set key value,获取值:get key
    • 设置值并添加过期时间 : setex key time value
    • 截取字符串:getrange key 起始 位数 注意位数从零开始
    • 替换字符串:setrange key 起始 替换值 注意位数从零开始
    • 不存在则创建 setnx key value
    • 拼接字符串:append key 拼接值
    • 获取字符串长度:strlen key
    • 一次性设置多个值:mset key1 value1 key2 value2......
    • 一次性获取多个值:mget key1 key2 key3
  2. 列表(List)

    • 字符串列表,可以作为队列或栈使用。
    • 图解:key: ["item1", "item2", ..., "itemN"]
    • 命令:将一个或几个值添加到队头:lpush list ll
    • 将一个或几个值添加到队尾:rpush list rr
    • 从队头移除第一个值 :lpop list
    • 从队尾移除第一个值:rpop list
    • 返回区间里的值:lrange list 开头,结尾
    • 获取list的长度:llen list
    • 通过索引来获取list中的某一个元素 lindex list 索引
    • 将一个元素插入到某一个元素的前面: linsert list before value1 value2
    • 将一个元素插入到某一个元素的后面:linsert list after value1 value2
  3. 集合(Set)

    • 无序集合,自动处理重复数据。
    • 图解:key: {"item1", "item2", ..., "itemN"}
    • 命令:往集合中添加元素:sadd set value
    • 查看集合所有元素:smember set
    • 判断集合中是否有该元素:sismember set value
    • 随机从集合中抽取出若干个元素:srandmember set 个数
    • 移动set1集合里的元素到set2里去 :smove set1 set2 value
    • 求两个集合的交集 sinter set1 set2
    • 求两个集合的并集并去重:sunion set1 set2
    • 求set1减去set2的集合:sdiff set1 set2
    • 随机删除集合的某个元素:spop set
  4. 有序集合(Sorted Set)

    • 与集合类似,但每个元素都有一个分数(score),按分数排序。
    • 图解:key: {(item1, score1), (item2, score2), ..., (itemN, scoreN)}
    • 命令:添加一个值:zadd zset 分数 value
    • 添加多个值:zadd zset 分数1 value1 分数2 value2 .....
    • 获取有序集合的所有元素:zrange zset 0 -1
    • 给zset的元素进行排序:zrangebyscore zset -inf +inf 若要输出则带上 withscores
    • 移除指定元素 :zrem zset value
    • 查看元素个数:zcard zset
    • 反转指定范围:zrevrange zset 起始 结束
  5. 哈希(Hash)

    • 键值对集合,其中每个键都关联着一个值。
    • 图解:key: {field1: "value1", field2: "value2", ..., fieldN: "valueN"}
    • 命令:往hash设置值:hset hash key value
    • 从hash中获得值:hget hash set
    • 一次性往hash中添加多个值 hset hash key1 value1 key2 value2
    • 一次性获取多个值:hget hash key1 key2
    • 获取所有的键值对:hgetall hash
    • 获得所有的键:hkeys hash
    • 获得所有的值:hvals hash
    • 删除指定的key:hdel hash key
    • 获得hash的长度:hlen hash

四、idea操作redis

4.1、添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

4.2、在yml文件中完成配置

我的redis没有设置密码所以不用配置password

spring
   redis:
    host: localhost  
    port: 6379
    database: 0

4.3、注册redis序列化器

序列化器主要是为了解决存储到redis中数据乱码的问题

创建一个config类,将RedisTemplate注册成Bean

java 复制代码
package com.sky.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板对象....");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis得连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis,key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return  redisTemplate;
    }
}

4.4、创建一个测试类来对redis进行基本的操作

java 复制代码
package com.sky.test;

import com.sky.config.RedisConfiguration;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

//@SpringBootTest
public class SpringDateRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    
    @Test
    public void TestRedisTemplate(){
        System.out.println(redisTemplate);
        1.字符串类型
//        ValueOperations valueOperations = redisTemplate.opsForValue();
//        //2.Hash类型
//        HashOperations hashOperations = redisTemplate.opsForHash();
//        //3.列表(类似与队列)
//        ListOperations listOperations = redisTemplate.opsForList();
//        //4.集合类型
//        SetOperations setOperations = redisTemplate.opsForSet();
//        //5.有序集合
//        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

    }
    @Test
    public void StringTest(){
        //获得redis数据库操作对象
        ValueOperations valueOperations = redisTemplate.opsForValue();

        //set key value
        valueOperations.set("name","张三");
        //get key
        valueOperations.get("name");
        //setex key seconds value
        valueOperations.set("yam","123456",1, TimeUnit.MINUTES);
        //setnx key value
        valueOperations.setIfAbsent("look","李四");
        valueOperations.setIfAbsent("look","王五");
    }
    @Test
    public void HashTest(){
        HashOperations hashOperations = redisTemplate.opsForHash();
        //Hset key field value
        hashOperations.put("student","name","小明");
        hashOperations.put("student","age","10");
        //Hget key field
        Object o = hashOperations.get("student", "name");
        System.out.println(o);
        //Hkeys key
        Set student = hashOperations.keys("student");
        //遍历集合
        for (Object o1 : student) {
            System.out.println(o1);
        }
        //Hvals key
        List student1 = hashOperations.values("student");

        //Hdel key filed
        hashOperations.delete("student","age");
    }
    @Test
    public  void ListTest(){
        ListOperations listOperations = redisTemplate.opsForList();
        //Lpush key value
        listOperations.leftPush("100","aa");
        listOperations.leftPush("100","bb");
        listOperations.leftPushAll("100","cc,dd,ee");
        //Lrange key start stop
        listOperations.range("100",0,-1);
        //lpop key
        listOperations.leftPop("100");
        //Llen key
        listOperations.size("100");

    }
    @Test
    public void SetTest(){
        SetOperations setOperations = redisTemplate.opsForSet();
        //Sadd key member1
        setOperations.add("Zoo","小猫","小狗","大象");
        setOperations.add("Home","小猫","小狗");
        //Smembers key
        setOperations.members("zoo");
        //Scard key
        System.out.println(setOperations.size("Zoo"));
        //Sinter members1 members2
        setOperations.intersect("Zoo","home");
        //Sunion members1 members2
        Set union = setOperations.union("Zoo", "home");
        for (Object o : union) {
            System.out.println(o);
        }
    }
    @Test
    public void ZsetTest(){
        //有序集合操作对象
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        //Zadd key score1 member1 score2 member2
        zSetOperations.add("花园","向日葵",10);
        zSetOperations.add("花园","百合",9);
        //Zrange  key start stop
        Set set = zSetOperations.range("花园", 0, -1);
        for (Object o : set) {
            System.out.println(o);
        }
        //Zrem key member1 member2......
        zSetOperations.incrementScore("花园","百合",5);
        zSetOperations.remove("花园","向日葵");

    }
}

五、redis的应用场景

Redis适用于需要快速访问和处理大量数据的应用程序,它的高性能和低延迟特性使其成为许多现代应用程序的首选数据存储解决方案。然而,由于其内存数据库的特性,Redis通常不适用于存储大量持久化数据,除非使用其持久化功能或与其他持久化存储解决方案结合使用

常常使用redis来进行缓存,提高请求响应速度

依据redis数据类型的特性来实现一些特殊的功能如字符串的setnx命令来实现分布式锁

redis的消息订阅来实现消息中间件的功能。

相关推荐
_oP_i1 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx1 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康1 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
zpjing~.~2 小时前
Mongo 分页判断是否有下一页
数据库
2401_857600952 小时前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
豪宇刘2 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意2 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
潇湘秦3 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石3 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器3 小时前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb