之前一直学前端,可以说是主前端,但是后面学校一些课设啥的,没办法学了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一起交流😘