一、redis概念
概念:redis是一款高性能的NOSQL系列的非关系型数据库。
关系型数据库
1、数据之间有关联关系
2、数据存储在硬盘的文件
非关系型数据库
1、数据之间没有关联关系
2、数据存储在内存中
总结:一般会将数据库存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据。
二、下载安装
1、下载网址:
2、安装
# 解压
tar zxvf redis-4.0.10.tar.gz
# 编译测试
sudo make test
# 编译安装
sudo make install
# 启动redis服务端
redis-server
# 启动redis客户端
redis-cli
三、redis数据结构
redis存储的是(key,value)格式的数据,其中key都是字符串,value有5种不同的数据结构。
value的数据结构:
- 字符串类型 string
- 哈希类型 hash(map格式)
- 列表类型 list(linkedlist格式)
- 集合类型 set
- 有序集合类型 sortedset
四、命令操作
1、字符串类型 string
- 存储:
set key value
- 获取:
get key
- 删除:
del key
cyh@chenyonuandembp ~ % redis-cli
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> get username
"zhangsan"
127.0.0.1:6379> del username
(integer) 1
127.0.0.1:6379> get username
(nil)
2、哈希类型 hash
- 存储:
hset key field value
- 获取:
hget key field
:获取指定的field对应的值
hgetall key
:获取所以的field和value
- 删除:
hdel key field
127.0.0.1:6379> hset myhash username lisi
(integer) 1
127.0.0.1:6379> hset myhash password 123
(integer) 0
127.0.0.1:6379> hget myhash username
"lisi"
127.0.0.1:6379> hget myhash password
"123"
127.0.0.1:6379> hgetall myhash
1) "password"
2) "123"
3) "username"
4) "lisi"
127.0.0.1:6379> hdel myhash username
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "password"
2) "123"
127.0.0.1:6379>
3、列表类型 list(允许重复元素)
可以添加一个元素到列表的头部(左边)或者尾部(右边):类似于队列
- 添加:
lpush key value
:将元素加入列表左边
rpush key value
:将元素加入列表右边
- 获取:
lrange key start end
:范围获取 - 删除:
lpop key
:删除列表最左边的元素,并将元素返回
rpop key
:删除列表最右边的元素,并将元素返回
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> lpush mylist c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lpop mylist
"c"
127.0.0.1:6379> rpop mylist
"a"
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
127.0.0.1:6379> lpush mylist c d e
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
4、集合类型 set(不允许重复元素)
存储:
sadd key value
获取:
smembers key
(获取set集合中所以元素)删除:
srem key value
127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> smembers myset
1) "d"
2) "a"
3) "c"
4) "b"
127.0.0.1:6379> srem myset a
(integer) 1
127.0.0.1:6379> smembers myset
1) "d"
2) "c"
3) "b"
5、有序集合类型 sortedset(不允许重复元素,且元素有顺序)
存储:
zadd key score value
获取:
zrange key start end
删除:
zrem key value
127.0.0.1:6379> zadd mysort 60 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 40 li
(integer) 1
127.0.0.1:6379> zadd mysort 40 li
(integer) 0
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "li"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "li"
2) "40"
3) "zhangsan"
4) "60"
5) "wangwu"
6) "80"
127.0.0.1:6379> zrem mysort li
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
6、通用命令
keys *
:查询所有的键type key
:获取键对应的value的类型del key
:删除指定的key value
127.0.0.1:6379> keys *
1) "myhash"
2) "mylist"
3) "myset"
4) "mysort"
5) "username"
127.0.0.1:6379> type mylist
list
127.0.0.1:6379> del username
(integer) 1
127.0.0.1:6379> keys *
1) "myhash"
2) "mylist"
3) "myset"
4) "mysort"
五、持久化
1、解释
redis是一个内存数据库,当redis服务重启,数据就会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
2、redis持久化机制
ROB:默认方式,不需要进行配置,默认使用这种机制。
(在一定的时间间隔中,检测key的变化情况,然后持久化数据)
编辑redis.conf文件
save 900 1 save 300 10 # save 60 10000 save 10 5
重新启动redis服务器,并指定配置文件名称
cyh@chenyonuandembp redis-5.0.4 % redis-server redis.conf
AOF*:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据
编辑redis.conf文件
# appendonly no(关闭aof) appendonly yes (开启aof) # appendfsync always (每一次执行都进行持久化) appendfsync everysec (每隔一秒进行一次持久化) # appendfsync no (不进行持久化)
重新启动redis服务器,并指定配置文件名称
cyh@chenyonuandembp redis-5.0.4 % redis-server redis.conf
六、java客户端 Jedis
1、Jedis介绍
一款java操作redis数据库的工具。
2、使用步骤
- 下载jedis的jar包
- 使用
// 1. 获取连接 Jedis jedis = new Jedis("localhost",6379); // 2. 操作 jedis.set("username","wangwu"); // 3. 关闭连接 jedis.close();
3、jedis操作各种redis中的数据结构
(1)jedis的string操作
@Test
public void stringTest() {
// 如果使用空参构造,则默认值为"localhost", 6379端口
Jedis jedis = new Jedis();
// string存储
jedis.set("name", "wangWu");
// 获取
String username = jedis.get("name");
System.out.println(username);
// 可以使用setex()f方法存储可以指定过期时间的key,value
// activecode:1234键值对存入redis,并且20秒后自动删除该键值对(可以用于验证码)
jedis.setex("activecode", 20, "1234");
jedis.close();
}
(2)jedis的hash操作
@Test
public void hashTest() {
Jedis jedis = new Jedis();
jedis.hset("user", "name", "Mary");
jedis.hset("user", "age", "24");
jedis.hset("user", "gender", "male");
String age = jedis.hget("user", "age");
System.out.println(age);
Map<String, String> map = jedis.hgetAll("user");
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
System.out.println(key + ":" + value);
}
jedis.close();
}
输出:
24
name:Mary
gender:male
age:24
(3)jedis的list操作
@Test
public void listTest() {
Jedis jedis = new Jedis();
jedis.lpush("list", "a","b","c");
jedis.rpush("list", "a","b","c");
List<String> list = jedis.lrange("list", 0, -1);
System.out.println(list);
String r1 = jedis.lpop("list");
System.out.println(r1);
String r2 = jedis.rpop("list");
System.out.println(r2);
List<String> list2 = jedis.lrange("list", 0, -1);
System.out.println(list2);
jedis.close();
}
输出:
[c, b, a, a, b, c]
c
c
[b, a, a, b]
(4)jedis的set操作
@Test
public void setTest() {
Jedis jedis = new Jedis();
jedis.sadd("set", "php","java","c","python");
Set<String> key = jedis.smembers("set");
System.out.println(key);
jedis.srem("set", "c");
jedis.close();
}
(5)jedis的sortedset操作
@Test
public void sortTest() {
Jedis jedis = new Jedis();
jedis.zadd("sort", 23, "张三");
jedis.zadd("sort", 37, "李四");
jedis.zadd("sort", 16, "王五");
Set<String> sort = jedis.zrange("sort", 0, -1);
System.out.println(sort);
jedis.zrem("sort", "张三");
jedis.close();
}
七、Jedis连接池
1、Jedis连接池
@Test
public void jedisPoolTest() {
// 创建一个配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大允许连接数
jedisPoolConfig.setMaxTotal(50);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(10);
// 创建jedis连接池对象
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);
// 获取连接
Jedis jedis = jedisPool.getResource();
// 使用
jedis.set("like", "sport");
// 归还到连接池中
jedis.close();
}
配置文件详情:
2、Jedis连接池工具类
JedisPoolUtils
工具类package jedis.util; 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; /** * @Author: cyh * @Date: 2020-02-13 21:37 * @Description: Jedis连接池工具类 **/ public class JedisPoolUtils { private static JedisPool jedisPool; static { InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties"); Properties pro = new Properties(); try { pro.load(is); } catch (IOException e) { e.printStackTrace(); } JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal"))); config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle"))); jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port"))); } /** * 获取连接方法 * @return */ public static Jedis getJedis() { return jedisPool.getResource(); } }
jedis.properties
配置类host=127.0.0.1 port=6379 maxTotal=50 maxIdle=10
- 测试
@Test public void jedisPoolUtilsTest() { Jedis jedis = JedisPoolUtils.getJedis(); // 使用 jedis.set("hello", "world"); // 归还到连接池中 jedis.close(); }
注意:使用redis缓存一些不经常发生变化的数据。如果数据库的数据一旦发生改变,则需要更新缓存。当数据库中的表执行增删改的操作时,需要修改redis缓存数据情况,先在service对应的增删改方法中,将redis删除,然后再次存入。