1. 什么时redis 1
Redis是一个基于内存的key-value结构数据库。
●基于内存存储, 读写性能高
●适合存储热点数据( 热点商品、资讯、新闻)
●企业应用广泛
2. redis入门 2
2.1 redis简介 2
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker,翻译为: Redis是 一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。
官网: https://redis.io
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS ( 每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。
NoSql (Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
2.1.1 关系型数据库(RDBMS)
➢Mysql
➢Oracle
➢DB2
➢SQLServer
2.1.2 非关系型 数据库(NoSql)
➢Redis
➢Mongo db
➢MemCached
2.2 Redis应用场景 2
➢缓存
➢任务队列
➢消息队列
➢分布式锁
2.3 下载和安装 2
Redis安装包分为windows版和Linux版:
●Windows版 下载地址: https://github.com/microsoftarchive/redis/releases
●Linux版 下载地址: https://download.redis.io/releases/
https://download.redis.io/releases/
2.3.1 在Linux系统安装Redis步骤 2
1.将Redis安装包上传到Linux
2.解压安装包,命令: tar -zxvf redis-4.0.0.tar.gz -C /usr/local
3.安装Redis的依赖环境gcc,命令: yum install gcc-C++
4.进入/usr/local/redis-4.0.0,进行编译,命令: make
5.进入redis的src目录,进行安装,命令: make install
2.3.2 在windows安装redis 2
这里我解压到E:\java\tools\Redis\ziliao\Redis-x64-3.2.100
2.4 在linux中启动redis 3
启动和连接 3
启动服务
连接redis
打开一个新的窗口,启动
连接
查看
停止redis服务ctrl+c
修改配置文件使之在后台运行
因为文件数据很大,我们可以先查找使用 /
修改保存退出
再次运行即可
客户端依旧可以连接
设置redis密码 4
再次启动服务
连接
输入密码
还可以登陆的同时输入密码
远程连接redis
我们在winows中远程连接linux中的redis服务
注释保存退出
开启服务
设置防火墙
按住shift+鼠标右键,选择在此处打开powershell窗口
2.5 在windows系统启动服务 3
启动服务
启动客户端
3. 数据类型 4
3.1 介绍 4
Redis存储的是key-value结构的数据,其中key是字符串类型,value有 5种常用的数据类型:
●字符串string
●哈希hash
●列表list
●集合set
●有序集合sorted set
3.2 五中常见的数据类型 4
4. 常用命令 5
为了方便起见我们使用windows的redis
4.1 字符串string操作命令 5
4.2 哈希hash操作命令 6
4.3 列表list 操作命令 7
4.4 集合set操作命令 8
4.5 有序集合sorted set操作命令 8
4.6 通用命令 9
5. 在java中操作Redis 10
5.1 介绍 10
Redis的Java客户端很多,官方推荐的有三种:
●Jedis
●Lettuce
●Redisson
Spring对Redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis
5.2 jedis 10
Jedis的maven坐标:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
5.2.1 使用Jedis操作Redis的步骤: 10
①获取连接
②执行操作
③关闭连接
代码在jedis_demo项目测试com.itheima.test
JedisTest
package com.itheima.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
/**
* 使用Jedis操作Redis 10
*/
public class JedisTest {
@Test
public void testRedis(){
//1 获取连接
Jedis jedis = new Jedis("localhost",6379);
//2 执行具体的操作,设置string类型
jedis.set("username","xiaoming");
//3 关闭连接
jedis.close();
}
}
package com.itheima.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
/**
* 使用Jedis操作Redis 10
*/
public class JedisTest {
@Test
public void testRedis(){
//1 获取连接
Jedis jedis = new Jedis("localhost",6379);
//2 执行具体的操作,设置string类型
jedis.set("username","xiaoming");
String value = jedis.get("username");
System.out.println(value);
//删除
// jedis.del("username");
jedis.hset("myhash","addr","bj");
String hValue = jedis.hget("myhash", "addr");
System.out.println(hValue);
System.out.println("==================");
//查看所有的key
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
//3 关闭连接
jedis.close();
}
}
5.3 Spring Data Redis 11
Spring Data Redis中提供了一个高度封装的类: RedisTemplate, 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
●ValueOperations: 简单K-V操作
●SetOperations: set类型数据操作
●ZSetOperations: zset类型数据操作
●HashOperations:针对map类型的数据操作
●ListOperations: 针对list类型的数据操作
代码在springdataredis_demo项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springdataredis_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
spring:
application:
name: springdataredis_demo
#Redis相关配置
redis:
host: localhost
port: 6379
#password: 123456
database: 0 #操作的是0号数据库
jedis:
#Redis连接池配置
pool:
max-active: 8 #最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
代码在 测试 com.itheima.test SpringDataRedisTest
操作String类型数据 11
//测试String类
@Test
public void testString(){
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("city","beijing");
}
执行程序,去客户端查
不仅找不到,还乱码,这是因为RedisTemplate这个类在操作redis的时候对key进行了序列化
我们需要提供一个配置类进行反序列化
反序列化配置类
代码在 main com.itheima.config RedisConfig 11
package com.itheima.config;
import org.springframework.cache.annotation.CachingConfigurerSupport;
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配置类 11
* 作用反序列化
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//默认的Key序列化器为:JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
配置好后,再次运行程序
package com.itheima.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
//演示Spring Data Redis 11
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {
@Resource
private RedisTemplate redisTemplate;
//测试String类
@Test
public void testString(){
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("city123","beijing");
String value = (String) redisTemplate.opsForValue().get("city123");
System.out.println(value);
//设置有过期时间的String类型 12
redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
//如果已经存在则设置不成功
//Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city123", "nanjing");
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
System.out.println(aBoolean);
}
}
操作hash类型数据 12
/**
* 操作Hash类型数据 12
*/
@Test
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
//存值
hashOperations.put("002","name","xiaoming");
hashOperations.put("002","age","20");
hashOperations.put("002","address","bj");
//取值
String age = (String) hashOperations.get("002", "age");
System.out.println(age);
//获得hash结构中的所有字段
Set keys = hashOperations.keys("002");
for (Object key : keys) {
System.out.println(key);
}
System.out.println("=================");
//获得hash结构中的所有值
List values = hashOperations.values("002");
for (Object value : values) {
System.out.println(value);
}
}
操作list类型的数据 12
/**
* 操作List类型的数据 12
*/
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
//存值
listOperations.leftPush("mylist","a");
listOperations.leftPushAll("mylist","b","c","d");
//取值
List<String> mylist = listOperations.range("mylist", 0, -1);
for (String value : mylist) {
System.out.println(value);
}
System.out.println("===============");
//删除队列中的元素
//获得列表长度 llen
Long size = listOperations.size("mylist");
int lSize = size.intValue(); //类型转换将long类型转为int
for (int i = 0; i < lSize; i++) {
//出队列
String element = (String) listOperations.rightPop("mylist");
System.out.println(element);
}
}
操作Set类型的数据 13
/**
* 操作Set类型的数据 13
*/
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
//存值
setOperations.add("myset4","a","b","c","a");
//取值
Set<String> myset = setOperations.members("myset4");
for (String o : myset) {
System.out.println(o);
}
//删除成员
setOperations.remove("myset4","a","b");
System.out.println("=======================");
//取值
myset = setOperations.members("myset4");
for (String o : myset) {
System.out.println(o);
}
}
操作ZSet类型的数据 13
/**
* 操作ZSet类型的数据 13
*/
@Test
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//存值
zSetOperations.add("myZset","a",10.0);
zSetOperations.add("myZset","b",11.0);
zSetOperations.add("myZset","c",12.0);
zSetOperations.add("myZset","a",13.0);
//取值
Set<String> myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
System.out.println("========================");
//修改分数
zSetOperations.incrementScore("myZset","b",20.0);
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//删除成员
zSetOperations.remove("myZset","a","b");
System.out.println("============================");
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
}
通用命令操作 14
/**
* 通用操作,针对不同的数据类型都可以操作 14
*/
@Test
public void testCommon(){
//获取Redis中所有的key
Set<String> keys = redisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
System.out.println("=====================");
//判断某个key是否存在
Boolean itcast = redisTemplate.hasKey("itcast");
System.out.println(itcast);
//删除指定key
redisTemplate.delete("myZset");
//获取指定key对应的value的数据类型
DataType dataType = redisTemplate.type("myset");
System.out.println(dataType.name());
//返回给定key剩余生存时间
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("id","zhangsan",20l,TimeUnit.SECONDS);
Long id = redisTemplate.getExpire("id");
System.out.println(id);
}
标签:redis,基础,System,println,Redis,redisTemplate,out
From: https://blog.51cto.com/u_15784725/6537944