Redis的入门与springboot中的基本使用

之前一直学前端,可以说是主前端,但是后面学校一些课设啥的,没办法学了java,一入java深似海啊🤣。最近因为想搞验证码登录,所以正好学一下redis了,这里记录一下。

Nob.1 redis的下载与连接

我们可以在redis的githup仓库进行windows版本的下载Releases · microsoftarchive/redis (github.com),不知道为啥我的githup不科学上网就进不去了,让我这个好公民没办法得科学上网了。

直接下载第二个。下载完成后就可以找一个地方解压了。

然后在此目录下打开控制台,输入命令:

redis-server.exe redis.windows.conf

启动后就可以看到redis启动成功了!

那客户端如何连接呢,可以使用redis-config.exe来连接:

redis-cli.exe

可以看到redis连接成功了。这是使用默认的连接,那如果以后是使用其他服务器上的redis服务咋办呢,那就需要指定更多参数了。这里使用redis-cli.exe -h localhost -p 6379指令来连接要求的redis,-h表示host(主机)可以填本地,也可以填你的服务器ip,-p表示port(端口号)redis的默认端口号就是6379。

redis-cli.exe -h localhost -p 6379

一般数据库肯定要设个密码对吧,否则不安全,所以看一下如何设置redis的连接密码。密码肯定在配置文件里面配置了,找到刚才解压目录下的config文件,使用软件打开。然后搜索到requirepass这个地方,打开注释后面跟的就是密码了,按照自己的习惯去更改密码。

重启一下服务就可以看到再连接就需要密码连接了,否则会提示鉴权失败

这时候就需要使用-a+设定的密码进行连接了,再执行keys * 可以看到就可以正常显示了。

这时候就有小伙伴想了,有没有和mysql这些数据库一样的可视化操作工具呢,有的,兄弟,有的,这里我使用的是AnotherRedisDesktopManager 发行版 - Gitee.com,大家可以自己下载安装,这里就不详细介绍如何安装了。这里有个小坑,我安装完后发现打开白屏了,我还以为不兼容,又去换个版本,发现还是白屏,我就上网查了一下,原来是显卡问题,我服了,要选择属性,在目标一栏后追加--disable-gpu

追加后为:"Another Redis Desktop Manager.exe" --disable-gpu

Nob.2 Redis的常用数据类型

1. String(字符串)

  • 描述:最基本的数据类型,可以存储字符串、整数或浮点数。
  • 常用命令
    • SET key value:设置键值对。
    • GET key:获取键对应的值。
    • INCR key:将键的值加1(适用于整数)。
    • DECR key:将键的值减1(适用于整数)。
    • SETEX key seconds value: 设定指定key的值,并将设定过期时间为seconds秒。
    • SETNX key value: 只有在key不存在时才设定key的值。
  • 应用场景:缓存、计数器、分布式锁等。

2. Hash(哈希)

  • 描述:类似于字典或对象,存储字段和值的映射。
  • 常用命令
    • HSET key field value:设置哈希表中的字段值。
    • HGET key field:获取哈希表中字段的值。
    • HGETALL key:获取哈希表中所有字段和值。
    • HDEL key field:删除哈希表中的字段。
    • HKEYS key:获取哈希表中所有字段。
    • HVALS key:获取哈希表中所有值。
  • 应用场景:存储对象数据,如用户信息、商品信息等。

3. List(列表)

  • 描述:有序的字符串列表,支持在头部或尾部插入、删除元素。
  • 常用命令
    • LPUSH key value:在列表头部插入元素。
    • RPUSH key value:在列表尾部插入元素。
    • LPOP key:移除并返回列表头部的元素。
    • RPOP key:移除并返回列表尾部的元素。
    • LRANGE key start stop:获取列表中指定范围的元素。
    • LLEN key:获取列表的长度。
  • 应用场景:消息队列、最新消息列表、任务队列等。

4. Set(集合)

  • 描述:无序且不重复的字符串集合。
  • 常用命令
    • SADD key member:向集合中添加元素。
    • SREM key member:从集合中移除元素。
    • SMEMBERS key:获取集合中所有元素。
    • SISMEMBER key member:判断元素是否在集合中。
    • SINTER key1 key2:获取多个集合的交集。
    • SUNION key1 key2:获取多个集合的并集。
  • 应用场景:去重、标签系统、共同好友等。

5. Sorted Set(有序集合)

  • 描述:与 Set 类似,但每个元素都关联一个分数(score),元素按分数排序。
  • 常用命令
    • ZADD key score member:向有序集合中添加元素。
    • ZREM key member:从有序集合中移除元素。
    • ZRANGE key start stop:获取有序集合中指定范围的元素。
    • ZREVRANGE key start stop:获取有序集合中指定范围的元素(按分数从高到低)。
    • ZSCORE key member:获取元素的分数。
    • ZRANK key member:获取元素的排名(按分数从低到高)。
  • 应用场景:排行榜、优先级队列、带权重的任务调度等。

6. Bitmap(位图)

  • 描述:基于 String 类型的位操作,可以看作是一个由二进制位组成的数组。
  • 常用命令
    • SETBIT key offset value:设置位图中指定偏移量的值(0或1)。
    • GETBIT key offset:获取位图中指定偏移量的值。
    • BITCOUNT key:统计位图中值为1的位数。
  • 应用场景:用户签到、活跃用户统计、布隆过滤器等。

7. HyperLogLog(基数统计)

  • 描述:用于估计集合中不重复元素的数量,占用空间小且误差率低。
  • 常用命令
    • PFADD key element:向 HyperLogLog 中添加元素。
    • PFCOUNT key:估计 HyperLogLog 中不重复元素的数量。
    • PFMERGE destkey sourcekey1 sourcekey2:合并多个 HyperLogLog。
  • 应用场景:大规模数据的去重统计,如 UV(独立访客)统计。

8. Geospatial(地理空间)

  • 描述:存储地理位置信息,支持计算地理位置之间的距离、范围查询等。
  • 常用命令
    • GEOADD key longitude latitude member:添加地理位置信息。
    • GEODIST key member1 member2:计算两个地理位置之间的距离。
    • GEORADIUS key longitude latitude radius:查询指定半径内的地理位置。
  • 应用场景:附近的人、地点搜索、地理位置分析等。

9. Stream(流)

  • 描述:用于实现消息队列,支持多消费者、消息持久化、消息回溯等功能。
  • 常用命令
    • XADD key ID field value:向流中添加消息。
    • XREAD COUNT num STREAMS key ID:从流中读取消息。
    • XGROUP CREATE key groupname ID:创建消费者组。
  • 应用场景:消息队列、事件日志、实时数据处理等。

10. 通用命令

  • 描述:不区分数据类型,都可以使用。
  • 常用命令
    • KEYS pattern:查找符合指定模式的key。
    • EXISTS key:检查key是否存在。
    • TYPE key:判断key的类型。
    • DEL key: 删除存在的key。

Nob.3 在Java中配置redis

在java中操作redis的方法肯定不止一种了,我这里学习的是Spring Data Redis这种方法操作redis,所以我就详细介绍Spring Data Redis这种操作方法了。

1.导入依赖

这不用多说啥,直接导入相关依赖就好。

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

2.在springboot中添加redis的配置信息

我这里yml配置,依据自己的项目做出改变

spring:
  redis:
    host: localhost
    port: 6379
    password: 你的密码
    database: 0
    jedis:
      #Redis连接池配置
      pool:
        max-active: 8 #最大连接数
        max-wait: 1ms #连接池最大阻塞等待时间
        max-idle: 4 #连接池中的最大空闲连接
        min-idle: 0 #连接池中的最小空闲连接

3.封装Configration配置代码

直接在我们的项目的配置中添加RedisConfig配置类

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;

/**
 * Redis配置类,用于配置RedisTemplate的序列化方式等。
 */
@Configuration  // 标识该类为配置类,Spring容器会扫描该类并加载其中的Bean定义
public class RedisConfig {

    /**
     * 配置RedisTemplate的Bean。
     * RedisTemplate是Spring Data Redis提供的一个用于操作Redis的工具类。
     *
     * @param connectionFactory Redis连接工厂,用于创建与Redis服务器的连接
     * @return 配置好的RedisTemplate实例
     */
     @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        // 设置 key 的序列化方式为 StringRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        // 设置 hash key 和 value 的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

4.测试

在我们的测试包里创建一个测试类,发现控制台输出了redisTemplate实例,说明配置完成了!记得启动你的redis。

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.*;

@SpringBootTest
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void test(){
        System.out.println(redisTemplate);
        ValueOperations valueOperations =  redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
}

Nob.4 在java中操作redis

为了便捷使用redis,可以在我们项目中的service层中封装redis操作,很简单我这里直接新建了一个redis目录用与放置redis的service。

然后这里给出redis常用数据类型的操作方法的封装代码:

1. String 类型操作类



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisStringService {

@Autowired
private RedisTemplate<String, String> redisTemplate;

/**
* 设置字符串类型的值
*
* @param key 键
* @param value 值
*/
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

/**
* 获取字符串类型的值
*
* @param key 键
* @return 值
*/
public String get(String key) {
return redisTemplate.opsForValue().get(key);
}

/**
* 删除键
*
* @param key 键
*/
public void delete(String key) {
redisTemplate.delete(key);
}

/**
* 判断键是否存在
*
* @param key 键
* @return 是否存在
*/
public boolean exists(String key) {
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
}
}


2. Hash 类型操作类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class RedisHashService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 设置 Hash 类型的字段值
     *
     * @param key   键
     * @param field 字段
     * @param value 值
     */
    public void put(String key, String field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 获取 Hash 类型的字段值
     *
     * @param key   键
     * @param field 字段
     * @return 值
     */
    public Object get(String key, String field) {
        return redisTemplate.opsForHash().get(key, field);
    }

    /**
     * 获取 Hash 类型的所有字段和值
     *
     * @param key 键
     * @return 所有字段和值
     */
    public Map<Object, Object> entries(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 删除 Hash 类型的字段
     *
     * @param key   键
     * @param field 字段
     */
    public void delete(String key, String field) {
        redisTemplate.opsForHash().delete(key, field);
    }
}


3. List 类型操作类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class RedisListService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 向列表左侧添加元素
     *
     * @param key   键
     * @param value 值
     */
    public void leftPush(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 向列表右侧添加元素
     *
     * @param key   键
     * @param value 值
     */
    public void rightPush(String key, Object value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 获取列表范围内的元素
     *
     * @param key   键
     * @param start 起始位置
     * @param end   结束位置
     * @return 元素列表
     */
    public List<Object> range(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

    /**
     * 移除并获取列表左侧的第一个元素
     *
     * @param key 键
     * @return 元素
     */
    public Object leftPop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }
}


4. Set 类型操作类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
public class RedisSetService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 向集合中添加元素
     *
     * @param key    键
     * @param values 值
     */
    public void add(String key, Object... values) {
        redisTemplate.opsForSet().add(key, values);
    }

    /**
     * 获取集合中的所有元素
     *
     * @param key 键
     * @return 元素集合
     */
    public Set<Object> members(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 判断元素是否在集合中
     *
     * @param key   键
     * @param value 值
     * @return 是否存在
     */
    public boolean isMember(String key, Object value) {
        return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(key, value));
    }

    /**
     * 移除集合中的元素
     *
     * @param key    键
     * @param values 值
     */
    public void remove(String key, Object... values) {
        redisTemplate.opsForSet().remove(key, values);
    }
}


5. ZSet 类型操作类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
public class RedisZSetService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 向有序集合中添加元素
     *
     * @param key   键
     * @param value 值
     * @param score 分数
     */
    public void add(String key, Object value, double score) {
        redisTemplate.opsForZSet().add(key, value, score);
    }

    /**
     * 获取有序集合中指定范围的元素
     *
     * @param key 键
     * @param start 起始位置
     * @param end   结束位置
     * @return 元素集合
     */
    public Set<Object> range(String key, long start, long end) {
        return redisTemplate.opsForZSet().range(key, start, end);
    }

    /**
     * 获取有序集合中指定分数范围的元素
     *
     * @param key 键
     * @param min 最小分数
     * @param max 最大分数
     * @return 元素集合
     */
    public Set<ZSetOperations.TypedTuple<Object>> rangeByScore(String key, double min, double max) {
        return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);
    }

    /**
     * 移除有序集合中的元素
     *
     * @param key    键
     * @param values 值
     */
    public void remove(String key, Object... values) {
        redisTemplate.opsForZSet().remove(key, values);
    }
}

OK,那我们如何使用呢,直接在我们要用的地方导入咱们封装的service就好,我这里用测试类为例子。

import com.yaojie.service.redis.RedisHashService;
import com.yaojie.service.redis.RedisStringService;
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.*;

@SpringBootTest
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RedisStringService redisStringService;

    @Autowired
    private RedisHashService redisHashService;
    @Test
    public void test(){
        // 操作 String 类型
        redisStringService.set("name", "John");
        String name = redisStringService.get("name");

        //操作 Hash 类型
        redisHashService.put("user:1", "name", "Alice");
        Object userName = redisHashService.get("user:1", "name");
    }
}

好了直接运行,看看结果,可以看到测试通过,再用可视化工具看看咱们的redis中有没有结果,可以看到OK了。结束!

Nob.5 总结

可以说redis的入门和基本使用还是比较简单,比mysql那些简单一些,没有那么多的语法,但是我现在接触到的也只是浅显的,后面真干java了再好好深入吧🤣。每天进步一点点!

欢迎来我自己搭的个人博客知足的blog一起交流😘 ​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值