redis学习笔记
1.概念
redis是一款高性能的NOSQL系列的非关系型数据库
-
关系型数据库:
- 1-数据之间有关联关系
- 2-数据存储在硬盘文件上面
-
非关系型数据库:
- 1-数据质检没有关系
- 2-数据存储在内存中
综上所述:利用redis做缓存,提高数据查询的效率。
-
补充:redis是用c语言开发的一个开源的高性能键值对key-value数据库,redis支持的键值数据类型
- 1-string:常用
- 2-hash:map
- 3-list: ArrayList/LinkedList
- 4-set: HashSet
- 5-sortedset(有序集合类型):有序无重复
-
应用场景:
- 缓存(数据查询、短连接、新闻内容、商品内容等)
- 聊天在线好友列表
- 任务队列(秒杀、抢购、12306等)
- 应用的排行榜
- 网站的访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群架构中的session分离
redis官网:https://www.redis.net.cn/
- 安装过程:
- 解压:tar zxvf redis-6.0.9.tar.gz
- 移动到:sudo mv redis-6.0.9 /usr/local
- 切换到:cd /usr/local/redis-6.0.9/
- 编译测试:make test
- 编译安装:make install
- 启动服务:redis-server
-
客户端操作: redis-cli
出现上方左图,说明可以在客户端交互式的使用redis的一些命令,可以输入shutdown关闭服务端,exit退出
2.命令操作
1)数据结构
redis存储的是key-value格式的数据,key是字符串,value有5种不同的数据结构
2)字符串类型:string
- 存储: set key value
- 获取: get key
- 删除: del key
3) 哈希类型:Hash
- 存储: hset key field value
- 获取: hget key field
- 获取所有:hgetall key
- 删除: hdel key field
4) 列表类型:List
- 左存储: lpush key value
- 右存储: rpush key value
- 范围获取 :lrange key start end
- 左删除: lpop key(删除列表最左边的元素,并将元素返回)
- 右删除: rpop key(删除列表最右边的元素,并将元素返回)
5) 集合类型:Set
- 存储: sadd key value
- 获取: smembers key (获取set集合中所有的元素) 获取的顺序与存入的顺序并不能保持一致
- 删除: srem key value(移除集合中的某个元素)
6) 有序集合类型:sortedset
- 存储: zadd key score value 根据score的权值进行排序
- 获取: zrange key start end
- 删除: zrem key value(移除集合中的某个元素)
7)通用命令
-
keys *(可以用正则表达式) 查询所有的key
-
type key 获取键对应的类型
-
del key 删除指定的key value
-
redis-server 开启redis服务
-
redis-cli 启动 redis 客户端
-
shutdown 关闭服务
3.持久化操作
-
redis是存放在内存中的数据库,不能长久储存,当redis服务器重启或者电脑宕机重启等数据会丢失,所以需要将内存中的数据持久化保存到硬盘文件中。
-
redis持久化机制 并不能保证绝对的安全,存在丢失数据的可能性
-
RDB:不需要配置,默认方式
-
在一定的间隔时间中国,检测key的变化情况,然后持久化数据(推荐使用,不影响性能)
-
Windows中:编辑redis.windows.conf文件 ,命令:redis-server.exe redis.windows.conf
-
Mac:编辑redis.conf,命令:redis-server即可
save 900 1 save 300 10 save 60 10000 # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed
-
-
-
AOF
-
日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
-
将配置文件中no改为yes开启AOF持久化机制
-
# appendfsync always:每一次操作都进行持久化 appendfsync everysec:系统默认,每隔一秒操作一次 # appendfsync no:关闭aof机制
-
-
4.使用java客户端操作redis
-
Jedis:一款java操作redis数据库的工具
-
使用步骤:
-
下载jedis的相关jar包
- commons-pool2-2.9.0.jar
- jedis-3.3.0.jar
-
使用
@Test public void test1(){ //1.获取连接 Jedis jedis = new Jedis("localhost",6379); //2.操作 jedis.set("name","zhangsan"); jedis.set("age","24"); //3.关闭连接 jedis.close(); }
-
-
Jedis操作各种redis中的数据结构
-
1-string:常用
-
set
-
get
@Test public void test2(){ //1.获取连接 Jedis jedis = new Jedis();//如果使用空参构造,默认localhost 6379 //2.存储 jedis.set("cCode","HelloWorld"); jedis.set("cName","Java"); //3.获取 String cCode = jedis.get("cCode"); String cName = jedis.get("cName"); //可以使用setex()方法存储可以指定过期时间的key-value //将activeCode,tenSeconds键值对存入redis,并且10秒后自动删除该键值对 jedis.setex("activeCode",10,"tenSeconds"); System.out.println(cCode); System.out.println(cName); //4.关闭连接 jedis.close(); }
-
-
2-hash:map
- hset
- hget
/** * @decription: hash数据结构操作 * @author:WZL 2020/12/3 7:51 下午 **/ @Test public void test3(){ //1.获取连接 Jedis jedis = new Jedis();//如果使用空参构造,默认localhost 6379 //2.存储 Map<String,String> data = new HashMap<String,String>(); data.put("name","zhangsan"); data.put("age","24"); data.put("gender","male"); jedis.hset("map",data); jedis.hset("user","name","zhangsan"); jedis.hset("user","age","24"); jedis.hset("user","gender","male"); //3.获取 String name = jedis.hget("map", "name"); String name2 = jedis.hget("user", "name"); System.out.println(name); System.out.println(name2); //4.获取全部 Map<String, String> user = jedis.hgetAll("user"); Set<String> keySet = user.keySet(); for(String key : keySet){ String value = user.get(key); System.out.println(key+"-----"+value); } //4.关闭连接 jedis.close(); }
-
3-list: ArrayList/LinkedList
- lpush/rpush
- lpop/rpop
/** * @decription: List数据结构操作 * @author:WZL 2020/12/3 8:01 下午 **/ @Test public void test4(){ //1.获取连接 Jedis jedis = new Jedis("localhost",6379); //2.存储 jedis.lpush("list","a","b","c"); jedis.rpush("list","a","b","c"); //3.获取 List<String> list = jedis.lrange("list", 0, -1); System.out.println(list); //3-1.pop获取 String s1 = jedis.lpop("list"); System.out.println(s1); String s2 = jedis.lpop("list"); System.out.println(s2); String s3 = jedis.lpop("list"); System.out.println(s3); List<String> list1 = jedis.lrange("list", 0, -1); System.out.println(list1); //4.关闭连接 jedis.close(); }
-
4-set: HashSet
- sadd
/** * @decription: Set数据结构操作 * @author:WZL 2020/12/3 8:01 下午 **/ @Test public void test5(){ //1.获取连接 Jedis jedis = new Jedis("localhost",6379); //2.存储 jedis.sadd("set","a","b","c","d"); //3.获取 Set<String> set = jedis.smembers("set"); for(String value : set){ System.out.println(value); } //4.关闭连接 jedis.close(); }
-
5-sortedset(有序集合类型):有序无重复
- zadd
/** * @decription: sortedSet数据结构操作 * @author:WZL 2020/12/3 8:01 下午 **/ @Test public void test6(){ //1.获取连接 Jedis jedis = new Jedis("localhost",6379); //2.存储 jedis.zadd("color",10,"red"); jedis.zadd("color",20,"green"); jedis.zadd("color",5,"blue"); //3.获取 Set<String> colorSet = jedis.zrange("color", 0, -1); for(String color : colorSet){ System.out.println(color); } //4.关闭连接 jedis.close(); }
-
-
Jedis连接池——JedisPool
-
JedisPool使用:
- 创建JedisPool连接池对象
- 调用方法 getResource()方法获取Jedis连接
/** * @decription: JedisPool * @author:WZL 2020/12/3 8:49 下午 **/ @Test public void test7(){ //0.创建配置对象 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(50);//最大连接数 config.setMaxIdle(10);//最大空闲连接 //.... //1.创建Jedis连接池对象 JedisPool jedisPool = new JedisPool(config,"localhost",6379); //2.获取连接 Jedis jedis = jedisPool.getResource(); //3.存储 jedis.set("name","zhangsan"); //4.获取 String name = jedis.get("name"); System.out.println(name); //5.归还 jedis.close(); }
-
连接池配置相关信息
-