Redis零基础教程及SpringBoot整合Redis与使用
一.概述与下载安装
Redis
是一款NoSql
系列的非关系型数据库,而我们所知道的mysql
是一款关系型的数据库,关系型数据库的数据之间是有关联的并且数据存放在硬盘里,而非关系型的数据库的数据之间是没有关联的并且数据存放在内存当中。
redis官网,这里我也提供了网盘的下载版本。
链接:https://pan.baidu.com/s/177CSfTLAaKOUZmH_kJvWvA
提取码:9p9y
下载好安装包包直接解压就算安装成功了,非常的简单。解压成功后
然后了解下面三个文件即可:
redis.windows.conf:配置文件
redis-cli.exe:redis的客户端
redis-server.exe:redis服务器端
双击redis-server.exe
启动redis
服务器端:
双击redis-cli.exe
启动redis
的客户端
二.redis讲解
1.redis数据结构
redis数据存储的方式是键值对的方式:key:value
,其中key
只能是字符串
的方式,value
可以有5种方式(但到最后其实也只是字符串
):
- 字符串类型 string
- 哈希类型 hash:map格式
- 列表类型 list:linkedlist格式。支持重复元素
- 集合类型 set:不允许重复元素
- 有序集合类型sortedset:不允许重复元素,且元素有顺序
2.redis命令行操作
首先看下面的讲解在对照者看后面的命令行
①. 字符串类型 string
1. 存储: set key value
127.0.0.1:6379> set username zhangsan
OK
2. 获取: get key
127.0.0.1:6379> get username
"zhangsan"
3. 删除: del key
127.0.0.1:6379> del age
(integer) 1
②. 哈希类型 hash
1. 存储: hset key field value
127.0.0.1:6379> hset myhash username lisi
(integer) 1
127.0.0.1:6379> hset myhash password 123
(integer) 1
2. 获取:
* hget key field: 获取指定的field对应的值
127.0.0.1:6379> hget myhash username
"lisi"
* hgetall key:获取所有的field和value
127.0.0.1:6379> hgetall myhash
1) "username"
2) "lisi"
3) "password"
4) "123"
3. 删除: hdel key field
127.0.0.1:6379> hdel myhash username
(integer) 1
③. 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
1. 添加:
1. lpush key value: 将元素加入列表左表
2. rpush key value:将元素加入列表右边
127.0.0.1:6379> lpush myList a
(integer) 1
127.0.0.1:6379> lpush myList b
(integer) 2
127.0.0.1:6379> rpush myList c
(integer) 3
2. 获取:
* lrange key start end :范围获取
127.0.0.1:6379> lrange myList 0 -1
1) "b"
2) "a"
3) "c"
3. 删除:
* lpop key: 删除列表最左边的元素,并将元素返回
* rpop key: 删除列表最右边的元素,并将元素返回
④. 集合类型 set : 不允许重复元素
1. 存储:sadd key value
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
2. 获取:smembers key:获取set集合中所有元素
127.0.0.1:6379> smembers myset
1) "a"
3. 删除:srem key value:删除set集合中的某个元素
127.0.0.1:6379> srem myset a
(integer) 1
⑤. 有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
1. 存储:zadd key score value
127.0.0.1:6379> zadd mysort 60 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 50 lisi
(integer) 1
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
2. 获取:zrange key start end [withscores]
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
5) "lisi"
6) "500"
3. 删除:zrem key value
127.0.0.1:6379> zrem mysort lisi
(integer) 1
①string类型
②hash类型
③列表类型
④set类型(不允许重复元素)
⑤ sortedset(有序集合类型)
⑥ 通用命令
- keys * : 查询所有的键
- type key : 获取键对应的value的类型
- del key:删除指定的key value
3.持久化
redis持久化有两种方案:
①RDB:默认方式,不需要进行配置,默认就使用这种机制,在一定的间隔时间中,检测key的变化情况,然后持久化数据
见redis.windows.conf
如下:
对上面的文件内容作如下修改
save 900 1
save 300 10
save 10 5
接下来演示就需要用命令行的方式来启动redis服务器
这样才可以生效:
下面演示注意最后那个目录下出现了dump.rdb
文件:
接下来关掉服务器重新双击启动服务器再来到客户端查询如下:
② AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
接下来我们看redis.windows.conf
如下:
这里我演示一下appendfsync everysec
,接下来演示就需要用命令行的方式来启动redis服务器
这样才可以生效:
那么这个时候应该会出现appendonly.aof
文件。
然后打开客户端执行下面内容:
set username 123
关掉服务器需要用命令行redis-server.exe redis.windows.conf
来启动redis服务器
,然后在客户端查询如下:
三.Jedis操作redis
所需要的jar
包放在这里了
链接:https://pan.baidu.com/s/1MeZL5RdkOZOqo6vC5BUHOA
提取码:a15z
1.入门案例
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class test {
@Test
public void test(){
//1.获取Jedis连接
Jedis jedis = new Jedis("localhost", 6379);
//2.操作
jedis.set("name","jack");
//3.关闭连接
jedis.close();
}
}
运行后得到查询如下:
2.五大类型操作演示
1.string类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class test {
/**
* string类型的演示
*/
@Test
public void test() throws InterruptedException {
//默认配置为:"localhost", 6379
Jedis jedis = new Jedis();
//1.set,get,del方法
System.out.println("1.set,get,del方法演示:");
jedis.set("name","tom");
String name = jedis.get("name");
System.out.println(name);
jedis.del("name");
name = jedis.get("name");
System.out.println(name);
//2.setex()方法,下面表示设置password:123,该键值对存活时间是2秒
System.out.println("2.setex()方法演示");
jedis.setex("password",2,"123");
String password = jedis.get("password");
System.out.println(password);
Thread.sleep(3000);
password = jedis.get("password");
System.out.println(password);
//3.关闭连接
jedis.close();
}
}
2.hash类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Map;
public class test {
/**
* hash类型的演示
*/
@Test
public void test() throws InterruptedException {
//默认配置为:"localhost", 6379
Jedis jedis = new Jedis();
//1.hset,hget,hdel方法
System.out.println("演示1.hset,hget,hdel方法:");
jedis.hset("user","name","jack");
jedis.hset("user","age","22");
jedis.hset("user","gender","male");
System.out.println(jedis.hget("user","name"));
System.out.println(jedis.hget("user","age"));
System.out.println(jedis.hget("user","gender"));
jedis.hdel("user","name");
System.out.println(jedis.hget("user","name"));
//2.hgetAll方法
System.out.println("演示2.hgetAll方法:");
Map<String, String> user = jedis.hgetAll("user");
for (String s : user.keySet()) {
System.out.println(s+":"+user.get(s));
}
//3.关闭连接
jedis.close();
}
}
3.list类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Map;
public class test {
/**
* list类型的演示
*/
@Test
public void test() throws InterruptedException {
//默认配置为:"localhost", 6379
Jedis jedis = new Jedis();
//1.lpush,rpush,lrange方法
System.out.println("演示1.lpush,rpush,lrange方法:");
jedis.lpush("myList","a","b","c");
jedis.rpush("myList","a","b","c");
List<String> myList = jedis.lrange("myList", 0, -1);
for (String s : myList) {
System.out.print(s+" ");
}
System.out.println();
//2.演示lpop,rpop,方法
System.out.println("演示2.演示lpop,rpop,方法:");
jedis.lpop("myList");
jedis.rpop("myList");
myList = jedis.lrange("myList", 0, -1);
for (String s : myList) {
System.out.print(s+" ");
}
//3.关闭连接
jedis.close();
}
}
4.set类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class test {
/**
* set类型的演示
*/
@Test
public void test() throws InterruptedException {
//默认配置为:"localhost", 6379
Jedis jedis = new Jedis();
//1.sadd,smembers方法
System.out.println("演示1.sadd,smembers方法:");
jedis.sadd("mySet","a","b","c");
Set<String> mySet = jedis.smembers("mySet");
for (String s : mySet) {
System.out.print(s+" ");
}
System.out.println();
//2.srem方法
System.out.println("演示2.srem方法:");
jedis.srem("mySet","a");
mySet = jedis.smembers("mySet");
for (String s : mySet) {
System.out.print(s+" ");
}
//3.关闭连接
jedis.close();
}
}
5.sortedset类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class test {
/**
* sortedset类型的演示
*/
@Test
public void test() throws InterruptedException {
//默认配置为:"localhost", 6379
Jedis jedis = new Jedis();
//1.zadd,zrange方法
System.out.println("演示1.zadd,zrange方法:");
jedis.zadd("mySorted",92.0,"tom");
jedis.zadd("mySorted",98,"jack");
jedis.zadd("mySorted",97,"jerry");
Set<String> mySorted = jedis.zrange("mySorted", 0, -1);
for (String s : mySorted) {
System.out.print(s+" ");
}
System.out.println();
//2.zrem方法
System.out.println("演示:2.zrem方法");
jedis.zrem("mySorted","tom");
mySorted = jedis.zrange("mySorted", 0, -1);
for (String s : mySorted) {
System.out.print(s+" ");
}
//3.关闭连接
jedis.close();
}
}
3.连接池使用介绍
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Set;
public class test {
/**
* sortedset类型的演示
*/
@Test
public void test() throws InterruptedException {
/**
* #最大活动对象数
* redis.pool.maxTotal=1000
* #最大能够保持idel状态的对象数
* redis.pool.maxIdle=100
* #最小能够保持idel状态的对象数
* redis.pool.minIdle=50
* #当池内没有返回对象时,最大等待时间
* redis.pool.maxWaitMillis=10000
* #当调用borrow Object方法时,是否进行有效性检查
* redis.pool.testOnBorrow=true
* #当调用return Object方法时,是否进行有效性检查
* redis.pool.testOnReturn=true
* #“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
* redis.pool.timeBetweenEvictionRunsMillis=30000
* #向调用者输出“链接”对象时,是否检测它的空闲超时;
* redis.pool.testWhileIdle=true
* # 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
* redis.pool.numTestsPerEvictionRun=50
* #redis服务器的IP
* redis.ip=xxxxxx
* #redis服务器的Port
* redis1.port=6379
*/
//0.获取连接池设置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大连接数
jedisPoolConfig.setMaxTotal(30);
//设置最大空闲时间
jedisPoolConfig.setMaxIdle(20);
//1.创建jedis连接池对象
JedisPool jedisPool = new JedisPool();
JedisPool jedisPool1 = new JedisPool(jedisPoolConfig, "localhost", 6379);
//2.获取jedis对象
Jedis resource = jedisPool.getResource();
/*
这里使用我们前面讲的方法即可
*/
}
}
三.SpringBoot整合redis
1.创建好SpringBoot
项目后引入redis
启动器:
<!-- 配置使用redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.在application.properties
文件加入下面内容
spring.redis.host=127.0.0.1
spring.redis.port=6379
RedisTemplate常用方法总结
使用RedisTemplate操作Redis数据库
打开服务器,接下来测试(我已经设置了name="jack"
):
package com.jack.database_exp;
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.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DatabaseExpApplicationTests {
@Autowired
RedisTemplate<String,String> redisTemplate;
@Test
public void contextLoads(){
String name = redisTemplate.boundValueOps("name").get();
System.err.println(name);
}
}