1.redis概念
2.下载安装
3.redis数据结构
- redis存储的是:key,value格式数据,其中key都是字符串,value有5种不同的数据结构
- value数据结构
- 字符串 string
- 哈希表 hash 相当于java的map
- 列表 list 相当于java的linkedlist链表
- 集合类型 set 相当于java的hashset
- 有序集合类型 sortedset
4.redis命令行操作
官方的详细的命令行操作文档
常用的命令行操作:
(1)字符串类型 string
1. 存储:set key value
2. 获取:get key
3. 删除:del key
(2)哈希类型 hash
1. 存储:hset key field value
2. 获取:hget key field
3. 删除:hdel key field
(3)列表类型 list
1. 添加:lpush key value:将元素加入列表左边
2. 添加:rpush key value:将元素加入列表右边
3. 范围的获取:lrange key start end
4. 删除列表最左边的元素并将元素返回:lpop key
5. 删除列表最右边的元素并将元素返回:rpop key
(4)集合类型 set:不允许重复元素
- 存储:sadd key value
- 获取:smembers key:获取set集合中所有元素
- 删除:srem key value:删除set集合的某个元素
(5)有序集合类型sortedset:不允许重复元素,且元素有顺序
- 存储:zadd key score value
- 获取:zrange key start end
- 删除:zrem key value
(6)通用命令
- keys * :查询所有的键
- type key:获取键对应的value的类型
- del key 删除指定的key value
5.持久化
(1)持久化使用场景
redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis内存当中的数据持久化保存到硬盘的文件中
(2)redis持久化机制
1.RDB:默认方式
不需要配置,默认就使用这种机制,在一定的间隔中,检测key的变化情况,然后持久化数据
1.1编辑redis.conf文件进行配置
save 900 1 //15分钟之内有一个key改变就持久化一次
save 300 10 //5分钟之内有10个key发送改变就持久化一次
save 60 10000 //60秒内有10000个key发送改变就持久化一次
2.AOF:日志记录的方式
可以记录每一条命令的操作后,持久化数据
2.1编辑reids.conf文件进行配置
appendonly no(关闭aof) --> appendonly yes(开启aof)
appendsync always //每一次操作都进行持久化
appendfsync everysec //默认是每隔一秒进行一次持久化
appendfsync no //不进行持久化
5.java客户端 Jedis
(1)使用场景
Jedis是一款java操作redis数据库的工具
(2)使用步骤
1.下载jedis的jar包
2. 使用
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
@Test
public void test1(){
//1.获取连接
Jedis jedis = new Jedis("192.168.83.120",6379);
//2.操作
jedis.set("username","zhansgan");
//3.释放资源
jedis.close();
}
}
(3)Jedis操作各种redis中的数据结构
1.Jedis操作string
@Test
public void stringTest() {
//1.获取连接
Jedis jedis = new Jedis("192.168.83.120", 6379);
//2.操作
//2.1存储
jedis.set("username", "zhansgan");
//2.2获取
String username = jedis.get("username");
System.out.println(username);
//可以使用setex()方法存储指定过期时间的key value
jedis.setex("activecode",20,"hehe"); //将k,v存入redis,并且20秒后自动删除键值对
//3.释放资源
jedis.close();
}
2.Jedis操作hash
@Test
public void hashTest(){
//1.获取连接
Jedis jedis = new Jedis("192.168.83.120", 6379);
//2.操作
//2.1存储hash
jedis.hset("user","name","lisi");
jedis.hset("user","age","23");
jedis.hset("user","gender","famale");
//获取hash
String name = jedis.hget("user", "lisi");
System.out.println(name);
//获取hash的所以map中的数据
Map<String, String> user = jedis.hgetAll("user");
//keyset
Set<String> keySet = user.keySet();
for (String key : keySet) {
//通过k获取v
String value = user.get(key);
System.out.println(key+":"+value);
}
//3.释放资源
jedis.close();
}
3.Jesis操作list
@Test
public void listTest(){
//1.获取连接
Jedis jedis = new Jedis("192.168.83.120", 6379);
//2.操作
//list操作
jedis.lpush("mylist","a","b","c"); //从左边存
jedis.rpush("mylist","a","b","c"); //从右边存
//list范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
//list弹出
String element = jedis.lpop("mylist");
System.out.println(element);
String element1 = jedis.rpop("mylist");
System.out.println(element1);
}
4.set和sortedset
@Test
public void setTest(){
//1.获取连接
Jedis jedis = new Jedis("192.168.83.120", 6379);
//2.操作
//set存储
jedis.sadd("myset","java","php","c++");
//set获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);//[c++, java, php]
}
@Test
public void sortedsetTest(){
//1.获取连接
Jedis jedis = new Jedis("192.168.83.120", 6379);
//2.操作
//sortedset存储
jedis.zadd("mysortedset",2,"亚瑟");
jedis.zadd("mysortedset",2,"后裔");
jedis.zadd("mysortedset",5,"兰陵王");
//sortedset获取
Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);//从小大大[亚瑟, 后裔, 兰陵王]
}
6.Jedis连接池JedisPool
(1)连接池使用方式步骤
@Test
public void jedisPoolTest(){
//创建配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
//1.创建Jedis连接池对象
JedisPool jedisPool = new JedisPool(config,"192.168.83.120",6378);
//2.获取连接
Jedis jedis = jedisPool.getResource();
//3.使用
jedis.set("hehhe","haha");
//4.归还到,连接池中
jedis.close();
}
(2)JedisPool详细配置
#最大活动对象数
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
(3)连接池工具类
1.设置配置文件
jedis.properties文件
host=192.168.83.120
port=6379
maxTotal=50
maxIdle=10
2.创建连接池工具类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 工具类
* 加载配置文件,配置连接池的参数
* 提供获取连接的方法
*/
public class JedisPoolUtil {
private static JedisPool jedisPool;
// TODO: 2020/5/31 设置一个静态代码块当类加载时先读取配置文件
static {
//读取配置文件,使用类加载器
//返回用于读取指定资源的输入流
InputStream inputStream = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties properties = new Properties();
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置到JedisPoolfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
//初始化JedisPool对象
jedisPool = new JedisPool(config, properties.getProperty("host"), Integer.parseInt(properties.getProperty("port")));
}
/**
* 核心代码
* 获取连接方法
*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
}