赞
踩
NoSQL数据库
,重点关注数据存储格式,是key-value格式,也就是键值对的存储形式。(redis是对Mysql的补充)
Redis安装包分为 Windows 版和 Linux 版:
下载的安装包有两种形式,一种是一键安装的msi文件,还有一种是解压缩就能使用的zip文件,哪种形式都行。
Redis的Windows版属于绿色软件,直接解压zip文件即可使用,解压后目录结构如下:
通过快捷键Ctrl + C 即可停止Redis服务
客户端连接命令:redis-cli.exe
注意:通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口(初学者无需调整服务器对外服务端口,默认6379。)。也可以通过指定如下参数连接:
redis设置密码:
用法说明:
set name tom =》表示 设置 键名为name的值为tom,这里的name就是key的名称(键名)
get name =》表示 获取 键名为name的值
setex age 60 100 =》表示 设置 键名为age的值为100,并把age的过期时间设置为60秒。(从创建完成后开始计时60秒,之后该键名的值就会失效。
setnx month 12 =》当month键名不存在时,表示设置month的值为12,当month键名已经存在时,命令失效,无法设置成功。
用法说明:
hset 1 name zhangsan
=》表示 设置 key为1的哈希表,key里面filed的值为name,filed对应的值为zhangsan(可以把filed看成属性,然后把value看成属性值)
hget 1 name
=》表示 获取 存储在key为1的哈希表里面的字段为name的值
hdel 1 name
=》表示删除存储在key为1的哈希表中里面的字段名为name的字段
hkeys 1
=》表示获取key为1的哈希表的所有字段
hvals 1
=》表示获取key为1的哈希表里面的所有字段的值
Redis 的 Java 客户端很多,常用的几种:
Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发包进行了高度封装。
步骤①:导入springboot整合redis的starter坐标
上述坐标可以在创建模块的时候通过勾选的形式进行选择,归属NoSQL分类中
步骤②:进行基础配置
spring:
redis:
host: localhost
port: 6379
database: 10 # database是指定使用redis里面的哪个数据库(默认用的是0数据库)
操作redis,最基本的信息就是操作哪一台redis服务器,所以服务器地址属于基础配置信息,不可缺少。但是即便你不配置,目前也是可以用的。因为以上两组信息都有默认配置,刚好就是上述配置值。
步骤③:使用springboot整合redis的专用客户端接口操作,此处使用的是RedisTemplate
可以选择创建redis对象:(在里面可以添加一些操作)
@Configuration
@Slf4j //日志的注解,有它下面的log.info才能使用
public class RedisConfiguration {
@Bean // 按照类型 注入对象RedisConnectionFactory
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板类...");
RedisTemplate redisTemplate = new RedisTemplate();
// 设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置Key的序列化器,默认为JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
测试类:注意,测试类的位置要和引导类处于同一目录下(一般用idea的Spring Initializr创建的测试环境自动给你建立好目录的,但是如果是使用maven自己导入依赖实现的springboot项目,写测试类的时候则需要建立和引导类所处的目录结构,或者在@SpringbootTest()注解里面指定引导类)
注意操作redis之前,记得启动redis。
@SpringBootTest
class SpringbootRedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void set() {
ValueOperations ops = redisTemplate.opsForValue();
ops.set("age",41);
}
@Test
void get() {
ValueOperations ops = redisTemplate.opsForValue();
Object age = ops.get("name");
System.out.println(age);
}
@Test
void hset() {
HashOperations ops = redisTemplate.opsForHash();
ops.put("info","b","bb");
}
@Test
void hget() {
HashOperations ops = redisTemplate.opsForHash();
Object val = ops.get("info", "b");
System.out.println(val);
}
}
在操作redis时,需要先确认操作何种数据,根据数据种类得到操作接口。例如使用opsForValue()获取string类型的数据操作接口,使用opsForHash()获取hash类型的数据操作接口,剩下的就是调用对应api操作了。各种类型的数据操作接口如下:
@SpringBootTest
public class springDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedisTemplate(){
System.out.println(redisTemplate);
// 获取字符串对象
ValueOperations valueOperations = redisTemplate.opsForValue();
// 获取hash对象
HashOperations hashOperations = redisTemplate.opsForHash();
// 获取list列表对象
ListOperations listOperations = redisTemplate.opsForList();
// 获取set对象
SetOperations setOperations = redisTemplate.opsForSet();
// 获取ZSet对象
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}
/**
* 操作字符串类型的数据
*/
@Test
public void testString(){
// 插入字符串类型的数据
redisTemplate.opsForValue().set("city","北京");
// 获取字符串类型的数据
String city = (String)redisTemplate.opsForValue().get("city");
System.out.println("city=== "+city);
// 设置key-value的有效时间
redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
// 只有在 key 不存在时设置 key 的值(常用例子:分布式锁)
redisTemplate.opsForValue().setIfAbsent("lock","1"); // 可以设置成功
redisTemplate.opsForValue().setIfAbsent("lock","2"); // 设置不成功
}
/**
* 操作hash类型的数据
*/
@Test
public void testHash(){
//hset hget hdel hkeys hvals
HashOperations hashOperations = redisTemplate.opsForHash();
// 插入一条hash类型的数据
hashOperations.put("100","name","tom");
hashOperations.put("100","age","20");
// 获取hash类型的数据
String name = (String) hashOperations.get("100", "name");
System.out.println(name);
// 获取所有key=100的hash表的所有的key
Set keys = hashOperations.keys("100");
System.out.println(keys);
// 获取所有key=100的hash表的所有的value
List values = hashOperations.values("100");
System.out.println(values);
// 删除字段
hashOperations.delete("100","age");
}
/**
* 操作列表类型的数据
*/
@Test
public void testList(){
//lpush lrange rpop llen
ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("mylist","a","b","c");
listOperations.leftPush("mylist","d");
List mylist = listOperations.range("mylist", 0, -1);
System.out.println(mylist);
listOperations.rightPop("mylist");
Long size = listOperations.size("mylist");
System.out.println(size);
}
/**
* 操作集合类型的数据
*/
@Test
public void testSet(){
//sadd smembers scard sinter sunion srem
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set1","a","b","c","d");
setOperations.add("set2","a","b","x","y");
Set members = setOperations.members("set1");
System.out.println(members);
Long size = setOperations.size("set1");
System.out.println(size);
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
Set union = setOperations.union("set1", "set2");
System.out.println(union);
setOperations.remove("set1","a","b");
}
/**
* 操作有序集合类型的数据
*/
@Test
public void testZset(){
//zadd zrange zincrby zrem
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("zset1","a",10);
zSetOperations.add("zset1","b",12);
zSetOperations.add("zset1","c",9);
Set zset1 = zSetOperations.range("zset1", 0, -1);
System.out.println(zset1);
zSetOperations.incrementScore("zset1","c",10);
zSetOperations.remove("zset1","a","b");
}
/**
* 通用命令操作
*/
@Test
public void testCommon(){
//keys exists type del
Set keys = redisTemplate.keys("*");
System.out.println(keys);
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
for (Object key : keys) {
DataType type = redisTemplate.type(key);
System.out.println(type.name());
}
redisTemplate.delete("mylist");
}
}
由于redis内部不提供java对象的存储格式,因此当操作的数据以对象的形式存在时,会进行转码,转换成字符串格式后进行操作。为了方便开发者使用基于字符串为数据的操作,springboot整合redis时提供了专用的API接口StringRedisTemplate,你可以理解为这是RedisTemplate的一种指定数据泛型的操作API。
@SpringBootTest
public class StringRedisTemplateTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void get(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
String name = ops.get("name");
System.out.println(name);
}
}
Spring Boot默认使用的Redis客户端是Lettuce。Lettuce是一个高性能的异步Redis客户端,它基于Netty框架实现了高效的异步通信。它支持连接池和集群模式,并提供了丰富的功能和灵活的配置选项。
切换成jedis客户端技术操作步骤如下:
步骤①:导入jedis坐标
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
edis坐标受springboot管理,无需提供版本号
步骤②:配置客户端技术类型,设置为jedis
spring:
redis:
host: localhost
port: 6379
client-type: jedis
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。