redis 非关系型数据库

redis

redis是NOSQL系列的非关系型数据库;NOSQL表示not only sql,就是非关系型数据库。

非关系型数据库:

  • 存储的是key和value形式(redis),还有文档形式(MongoDB),等等。数据之间没有关系。
  • 数据存储在内存中,提高检索效率(redis做缓存)

redis应用场景:

  • 缓存(商品、新闻)
  • 任务队列(车票、抢购)
  • 排行榜
  • 等等

redis的数据结构:

  • redis存储的是键值对,其中key都是字符串,value有5中不同的数据结构
  • 字符串类型 string
  • 哈希类型 hash:
  • 列表类型 list
  • 集合类型 set
  • 有序集合类型 sortedset

安装

下载从redis官方,或者redis中文网;解压后可以直接使用,其中的文件有:

  • redis.windows.conf 配置文件
  • redis-server.exe 服务器端
  • redis-cli.exe 客户端(先打开服务器端,再打开客户端 自动连接)

命令操作

  1. 字符串

    • 存储set key value
    • 获取get key
    • 删除del key
    set username zhangsan
    get username
    del username
    
  2. 哈希类型 (field和value相当于哈希的键值对,可以存储多个)

    • 存储hset key field value
    • 获取hget key field
    • 获取所有hgetall key
    • 删除hdel key field
    hset id1 username zhangsan
    hset id1 age 23
    hget id1 username
    hdel id1 age
    hdel id1
    
  3. 列表类型(可以从左边或右边添加)

    • 添加lpush key value 或者rpush key value
    • 获取lrange key start end ,如lrange mylist 0 -1表示获取所有元素
    • 删除lpop key或者rpop key
  4. 集合类型

    • 存储sadd key vlaue
    • 获取smembers key
    • 删除srem key value
  5. 有序集合

    • 存储zadd key score value 按照score排序
    • 获取zrange key start end
    • 删除zrem key value

通用命令

  1. keys * 查询所有键
  2. type key获取键的类型
  3. del key删除键值对

持久化

redis是一个内存数据库,当redis服务重启,数据会丢失,因此可以将数据保存到硬盘,叫持久化。但是不能保证绝对安全,因为持久化是按时间等设置的。

持久化机制:

  1. RDB:默认方式,不需要进行配置,默认就使用这种机制(产生一个rdb文件)
    • 使用方式:在一定的间隔时间内,检测key的变化情况,然后持久化数据
      • 打开redis.windows.conf文件,
      • 修改/添加 save 900 1(表示如果1个key发生改变,900秒持久一次)
      • 用命令启动redis:redis-server.exe redis.windows.conf
  2. AOF:日志记录的方式,可以记录每一条命令的操作,可以每次命令操作后,持久化数据,产生一个aof文件。对性能有影响,使用方式:
    • 修改配置文件redis.windows.conf,将appendonly no改成appendonly yes
    • 修改appendfsync
      • appendfsync everysec 默认,每秒持久化一次
      • appendfsync always 每一次操作都进行持久化
      • appendfsync no 不持久化
    • 用命令启动redis:redis-server.exe redis.windows.conf

Java操作

Jedis:一款java操作redis数据库的工具。

使用步骤:

  1. 导入jedis的jar包
  2. 获取连接 Jedis jedis = new Jedis("localhost", 6379); (指定IP和端口)
  3. 操作 jedis.set("username", "zhangsan"); (和命令操作差不多)
  4. 关闭连接 jedis.close();

特殊操作

存储过期时间,存储一段时间自己消失,如手机验证码:

jedis.setex("activecode", 20, "asdf") (存储20秒,键值对为activecode:asdf)

jedis连接池

jedis自带连接池,作用和jdcb连接池一样。

使用:

  1. 创建连接池对象JedisPool jdisPool = new JedisPool("localhost", 6379);
  2. 调用方法,获取jedis连接Jedis jedis = jedisPool.getResource();
  3. 操作
  4. 关闭连接jedis.close(); (归还到连接池中)
  5. 关闭连接池

连接池创建时,可以指定配置参数,如下:(具体配置参考配置文件)

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50); // 最大连接
config.setMaxIdle(10); // 最大空闲连接
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);

jedis工具类

把配置存在一个配置文件,然后把连接池、创建连接对象等操作放在工具类里面。

步骤:

  1. 将配置文件jedis.properties放在src目录下,修改配置文件。
  2. 创建JedisPoolUtils工具类,代码如下:
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")));
    }

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

    public static void close(Jedis jedis) {
        jedis.close();
    }
}

案例:下拉框中的省份,使用ajax+redis技术

  1. html代码:
    • 下拉框使用ajax技术(js代码):当选择下拉框时,从findProvinceServlet中查找所有省份;
  2. findProvinceServlet代码:
    • 调用ProvinceService查询所有省份
    • 将数据序列化json格式
    • 响应数据
  3. ProvinceService代码:
    • 先从redis缓存中查找,如果有直接返回,否则调用ProvinceDao从数据库中查找
  4. ProvinceDao代码:
    • 从mysql数据库中查询所有省份
原文地址:https://www.cnblogs.com/mingriyingying/p/13515012.html