Redis

作者: 开心的小哈 | 来源:发表于2022-05-29 22:41 被阅读0次

Redis

概念:redis是一款高性能的NOSQL系列的非关系型数据库
Redis使用C语言开发的一个开源的高性能键值对数据库,官网提供测试数据买0个并发1000000个请求,读的速度是110000次/S 写的速度是81000次/S, 且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持键值对数据类型如下:

  1. 字符串类型 string
  2. 哈希类型 hash
  3. 列表类型 list
  4. 集合类型 set
  5. 有序集合类型 sortedset

应用场景:

  • 缓存(数据库查询,短链接,新闻内容,商品内容等等)
  • 聊天室的在线好友列表
  • 任务队列(秒杀,抢购,123006等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群框架中的session分离

下载安装

  1. 官网: Redis下载
  2. 解压直接可以使用:
  • redis.windows.conf : 配置文件
  • redis-cli.exe redis的客户端
  • redis-service.exe:redis的服务器端
  1. 命令操作
  1. 字符串类型 string
    存储 set key values
    获取 get key
    删除 del key
  2. 哈希类型 hash map格式
    存储: hset key field value
    获取: hset key field获取对应的值,获取所有的键和值:hegtall key
    删除 hdel key field
  3. 列表类型 list linkedlist格式,可以添加一个元素到列表的左边或者右边
    lpush key value 将指定的元素加入列表左边
    rpush key value 将指定元素键入列表右边
    lpop key :删除处列表最左边的元素,并将元素返回
    rpop kye:删除列表最右边的元素,并将元素返回
    lrange key start end:返回获取元素,当是结束是-1是会查询全部数据;
  4. 集合类型 set 不允许有重复元素
    sadd key value 存储
    smembers key :获取set列表集合所有元素
    srem key value :删除set集合中的某个元素
  5. 有序集合类型 sortedset 不允许有重复元素并且会根据分值排序
    zadd key score value:存储,添加相同的即可进行修改;
    zrange key start end :获取,后面添加 withscores 可以将分数一起显示出来
    zrem key value:删除

通用命令

  1. keys * :可以输入正则表格式进行;
  2. type key :可以知道key 的类型
  3. del key : 删除指定的keyvalue

持久化

redis是一个内存数据库,当redis服务器重启,获取电脑重启后,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘文件中.
redis持久化机制

  1. RDB:默认方式,不需要进行配置,默认就是用这种机制;
    在一定的时间间隔中,检测key的变化情况,然后持久化数据

    1. 编辑redis.windows.conf文件
    # 在900秒之后如果至少有1个key被改变就会持久化一次;
    save 900 1   
    # 300秒之后如果至少有10个key被改变就会持久化一次;
    save 300 10
    # 60秒之后如果知道有10000个key 被改变就会持久化一次;
    save 60 10000
    
    1. 重新启动redis服务器并指定配置文件名称
      redis-server.exe redis.windows.conf 回车运行
      运行的时候,会持久化rdb文件;
  2. AOF: 日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,来持久化数据.

    1. 编辑redis.windows.conf文件
appendonly no(关闭aof)--> appendonly yes(开启aof)
appendfsync always:每一次操作都进行持久化
appendfsync everysec:每隔一秒进行一次持久化
appendfsync no 不进行持久化;

Java客户端 Jedis

  • jedis :一款java操作redis数据库的工具
  • 使用步骤
    1. 下载jedis的jar包:commons-pool2-2.3jar,jedis-2.7.0.jar
      //1. 获取连接
        Jedis jedis = new Jedis("localhost", 6379);
        //2.操作
        jedis.set("username","zhangsan");
        //3.关闭连接
        jedis.close();
    
  • Jedis操作redis中的数据结构
package com.itcast.jedis;

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class JedisTest {
    @Test
    public void test1(){
        //1. 获取连接
        Jedis jedis = new Jedis("localhost", 6379);
        //2.操作
        jedis.set("username","zhangsan");
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test2(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //2.操作
        jedis.set("username","zhangsan");
        String username = jedis.get("username");
        System.out.println(username);
        //可以使用 setex()指定时间过期时间的key value
        jedis.setex("code",20,"hehe");//将code hehe 存入redis并且20秒后删除该键值对
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test3(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //2.操作
        jedis.hset("user","name","lisi");
        jedis.hset("user","age","25");
        jedis.hset("user","gender","男");
        //获取hash
        String hget = jedis.hget("user", "name");
        System.out.println(hget);
        //获取hash所有中的数据
        Map<String, String> user = jedis.hgetAll("user");
        //keySet便利
        Set<String> strings = user.keySet();
        for(String s:strings){
            System.out.println(user.get(s));
        }
        //3.关闭连接
        jedis.close();
    }
    @Test
    public void test4(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //操作
        jedis.lpush("names","a","b","c");
        jedis.rpush("names","a","b","c");
        List<String> names = jedis.lrange("names", 0, -1);
        System.out.println(names);
        String names1 = jedis.lpop("names");
        String names2 = jedis.rpop("names");
        System.out.println(names1);
        System.out.println(names2);
        List<String> names11 = jedis.lrange("names", 0, -1);
        for (String s:names11){
            System.out.print(s);
        }
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test5(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //操作
        Long sadd = jedis.sadd("language", "java", "c++", "php");
        Set<String> myset = jedis.smembers("language");
        System.out.println(myset);
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test6(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //操作
        Long sadd = jedis.zadd("yx", 33,"java");
        Long hy = jedis.zadd("yx", 5,"hy");
        Long wuk = jedis.zadd("yx", 11,"swk");
        Set<String> myset = jedis.zrange("yx",0,-1);
        System.out.println(myset);
        //3.关闭连接
        jedis.close();
    }
}

Jedis连接池JedisPool

  1. 使用
  2. 创建jedisPool连接池对象
  3. 调用方法:getResource()方法获取Jedis链接
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(50);//最大链接数量
        jedisPoolConfig.setMaxIdle(10);//空闲链接数
        //1.创建jedis对象
        JedisPool jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
        Jedis resource = jedisPool.getResource();
        resource.set("name","张三");
        String name = resource.get("name");
        System.out.println(name);
        resource.close();//归还到jedisPool连接池中

JedisPool工具类

**
 * 加载配置文件,配置连接池的参数
 * 提供连接的方法
 */
public class JedisPoolUtils {
    private static JedisPool jedisPool;

    static{
        //读取jedis.properties文件信息
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建properties
        Properties ps = new Properties();
        try {
            ps.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        JedisPoolConfig jg = new JedisPoolConfig();
        jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxTotal")));
        jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxIdle")));
        //初始化jedisPool
         jedisPool = new JedisPool(jg, ps.getProperty("host"), Integer.parseInt(ps.getProperty("port")));
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

Properties

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
  1. 编辑redis.windows.conf文件
appendonly no(关闭aof)--> appendonly yes(开启aof)
appendfsync always:每一次操作都进行持久化
appendfsync everysec:每隔一秒进行一次持久化
appendfsync no 不进行持久化;

Java客户端 Jedis

  • jedis :一款java操作redis数据库的工具
  • 使用步骤
    1. 下载jedis的jar包:commons-pool2-2.3jar,jedis-2.7.0.jar
      //1. 获取连接
        Jedis jedis = new Jedis("localhost", 6379);
        //2.操作
        jedis.set("username","zhangsan");
        //3.关闭连接
        jedis.close();
    
  • Jedis操作redis中的数据结构
package com.itcast.jedis;

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class JedisTest {
    @Test
    public void test1(){
        //1. 获取连接
        Jedis jedis = new Jedis("localhost", 6379);
        //2.操作
        jedis.set("username","zhangsan");
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test2(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //2.操作
        jedis.set("username","zhangsan");
        String username = jedis.get("username");
        System.out.println(username);
        //可以使用 setex()指定时间过期时间的key value
        jedis.setex("code",20,"hehe");//将code hehe 存入redis并且20秒后删除该键值对
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test3(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //2.操作
        jedis.hset("user","name","lisi");
        jedis.hset("user","age","25");
        jedis.hset("user","gender","男");
        //获取hash
        String hget = jedis.hget("user", "name");
        System.out.println(hget);
        //获取hash所有中的数据
        Map<String, String> user = jedis.hgetAll("user");
        //keySet便利
        Set<String> strings = user.keySet();
        for(String s:strings){
            System.out.println(user.get(s));
        }
        //3.关闭连接
        jedis.close();
    }
    @Test
    public void test4(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //操作
        jedis.lpush("names","a","b","c");
        jedis.rpush("names","a","b","c");
        List<String> names = jedis.lrange("names", 0, -1);
        System.out.println(names);
        String names1 = jedis.lpop("names");
        String names2 = jedis.rpop("names");
        System.out.println(names1);
        System.out.println(names2);
        List<String> names11 = jedis.lrange("names", 0, -1);
        for (String s:names11){
            System.out.print(s);
        }
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test5(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //操作
        Long sadd = jedis.sadd("language", "java", "c++", "php");
        Set<String> myset = jedis.smembers("language");
        System.out.println(myset);
        //3.关闭连接
        jedis.close();
    }

    @Test
    public void test6(){
        //1. 获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
        //操作
        Long sadd = jedis.zadd("yx", 33,"java");
        Long hy = jedis.zadd("yx", 5,"hy");
        Long wuk = jedis.zadd("yx", 11,"swk");
        Set<String> myset = jedis.zrange("yx",0,-1);
        System.out.println(myset);
        //3.关闭连接
        jedis.close();
    }
}

Jedis连接池JedisPool

  1. 使用
  2. 创建jedisPool连接池对象
  3. 调用方法:getResource()方法获取Jedis链接
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(50);//最大链接数量
        jedisPoolConfig.setMaxIdle(10);//空闲链接数
        //1.创建jedis对象
        JedisPool jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
        Jedis resource = jedisPool.getResource();
        resource.set("name","张三");
        String name = resource.get("name");
        System.out.println(name);
        resource.close();//归还到jedisPool连接池中

JedisPool工具类

**
 * 加载配置文件,配置连接池的参数
 * 提供连接的方法
 */
public class JedisPoolUtils {
    private static JedisPool jedisPool;

    static{
        //读取jedis.properties文件信息
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建properties
        Properties ps = new Properties();
        try {
            ps.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        JedisPoolConfig jg = new JedisPoolConfig();
        jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxTotal")));
        jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxIdle")));
        //初始化jedisPool
         jedisPool = new JedisPool(jg, ps.getProperty("host"), Integer.parseInt(ps.getProperty("port")));
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

Properties

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

案例分析

  1. 提过index.html页面,页面中有一个省份 下拉列表
  2. 当页面加载完成后,发送ajax请求,加载所有省份

案例地址:
https://gitee.com/yan-chenglong1/text-reids

  • 注意:使用redis缓存一些不经常发生变化的数据.
    • 数据库的数据一旦发生改变,则需要更新缓存.
      • 数据库对应的表去执行了增删改的相关操作,我们需要将redis数据清空,再次存储;
      • service对应的增三改2方法中,将redis数据删除.

相关文章

网友评论

      本文标题:Redis

      本文链接:https://www.haomeiwen.com/subject/exmiprtx.html