redis和jedis

1、概念:是高性能的nosql系列,非关系型数据库

2、关系型数据库:表和表之间有关系,并且数据以文件的形式存储在硬盘上

3、非关系型数据库:数据和数据之间没有关系,并且数据存储在内存中

4、重要文件

1)redis.windows.conf 配置文件

2)redis-cli.exe redis的客户端

3)redis-server.exe redis的服务器端

先启动服务器端,在启动客户端

5、redsi的数据结构

redis存储的是key,value格式的数据,其中key都是字符串,value有五种不同的数据结构

1)字符串类型

2)哈希类型:map格式

3)列表类型:linkedlist格式,允许重复,rpush-将元素加到列表尾部,lpush-将元素加到列表头部,lrange-按照范围获取元素、lpop-删除列表最左边的元素并返回该元素,rpop-删除列表最右边的元素并返回该元素

4)集合类型:set格式,不保证顺序

5)有序集合类型:sortedset格式,不允许重复,每一个元素关联一个double的分数,redis通过该分数,对元素进行排序

6、通用命令

7、持久化

1)redis是内存数据库,当redis服务器重启,或者电脑重启后,数据会丢失,可以将redis内存中的数据持久化保存到硬盘的文件中,redis重启时会自动加载这这文件,保证数据不丢失

2)RDB:默认的持久化方式:在一定的间隔时间中检测key的变化情况,然后持久化数据,但是不能保证所有数据都不丢失

save 900 1:超过900s,至少有1个可以发生改变,则持久化一次

save 300 10:超过300s,至少有10个key发生改变,则持久化一次

save 60 10000:超过六十秒,有最少10000个key发生变化,则做一次持久化,存入dump.rdb文件中

3)AOF:日志记录的方式:可以记录每一条命令,每一次命令操作后去持久化数据,对性能影响较大

appendonly no,关闭AOF

appendonly yes,打开AOF

持久化时会生成一个.aof的文件

8、jedis使用

java 复制代码
package org.jedis;

import org.testng.annotations.Test;
import redis.clients.jedis.Jedis;

public class jedistest {

    @Test
    public void test1(){
        //获取连接
        Jedis jedis = new Jedis("localhost",6379);
        //操作
        jedis.set("name","hmy");
        //释放资源
        jedis.close();
    }
}

9、不同数据结构的jedis操作

java 复制代码
package org.jedis;

import org.testng.annotations.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(){
        //获取连接
        Jedis jedis = new Jedis("localhost",6379);
        //操作
        jedis.set("name","hmy");
        //释放资源
        jedis.close();
    }

    @Test
    public void test2(){
        //获取连接,如果使用空参数,那么默认就是localhost和6379
        Jedis jedis = new Jedis("localhost",6379);
        //将键值对my-kkk存入redis,并且20s后自动删除
        jedis.setex("my",20,"kkk");
        //释放资源
        jedis.close();
    }

    @Test
    public void test3(){
        //获取连接,如果使用空参数,那么默认就是localhost和6379
        Jedis jedis = new Jedis("localhost",6379);
        //存储hash
        jedis.hset("hashmap","name","hhh");
        jedis.hset("hashmap","age","13");
        jedis.hset("hashmap","gender","man");
        String age = jedis.hget("hashmap","age");
        System.out.println(age);
        Map<String,String> map = jedis.hgetAll("hashmap");
        Set<String> keys = map.keySet();
        for(String key : keys){
            System.out.println("key: "+key+"value: "+map.get(key));
        }
        //释放资源
        jedis.close();
    }

    @Test
    public void test4(){
        //获取连接,如果使用空参数,那么默认就是localhost和6379
        Jedis jedis = new Jedis("localhost",6379);
        //list存储
        jedis.lpush("listaa","a","b","c");
        jedis.rpush("listaa","a","b","c");
        //list的范围获取
        List<String> list = jedis.lrange("listaa",0,-1);
        System.out.println(list);
        //弹出
        String str1 = jedis.lpop("listaa");
        String str2 = jedis.rpop("listaa");
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(list);
        //释放资源
        jedis.close();
    }

    @Test
    public void test5(){
        //获取连接,如果使用空参数,那么默认就是localhost和6379
        Jedis jedis = new Jedis("localhost",6379);
        //set存储
        jedis.sadd("setaa","java","php","cpp");
        Set<String> set = jedis.smembers("setaa");
        System.out.println(set);
        //释放资源
        jedis.close();
    }

    @Test
    public void test6(){
        //获取连接,如果使用空参数,那么默认就是localhost和6379
        Jedis jedis = new Jedis("localhost",6379);
        //sortedset
        jedis.zadd("sorted",50,"aaaa");
        jedis.zadd("sorted",40,"bbbb");
        jedis.zadd("sorted",80,"cccc");
        jedis.zrange("sorted",0,-1);
        //释放资源
        jedis.close();
    }
}

8、jedis的连接池

java 复制代码
@Test
    public void test7(){
        //创建一个配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(50);//最大连接数
        config.setMaxIdle(10);//最大空闲连接数
        //获取连接池对象
        JedisPool jedisPool = new JedisPool(config);
        //获取连接
        Jedis jedis = jedisPool.getResource();
        jedis.set("namea","hhjjj");
        jedis.get("namea");
        //归还连接到连接池中
        jedis.close();
    }

9、抽取工具类

java 复制代码
package org.utils;

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 Jedisutils {

    private static JedisPool jedisPool;

    //在类加载的时候读取配置文件
    static {
        //读取配置文件
        InputStream is = Jedisutils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //使用properties类
        Properties properties = new Properties();
        try {
            properties.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //从配置文件中获取数据,并设置到JedisPoolConfig中
        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")));
    }

    /**
     * 获取连接的方法
     * @return
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }

}

10、使用缓存存储一些不长变化的数据,通过页面查询省份:https://github.com/musenh-hmy/demo10

java 复制代码
package com.example.service.impl;

import com.example.dao.ProvinceDao;
import com.example.dao.impl.ProviceDaoInpl;
import com.example.domain.Province;
import com.example.service.ProvinceService;
import com.example.util.Jedisutils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import redis.clients.jedis.Jedis;

import java.util.List;

public class ProvinceServiceImpl implements ProvinceService {

    private ProvinceDao dao = new ProviceDaoInpl();

    /**
     * 使用数据库查数据
     * @return
     */
    @Override
    public List<Province> findAll() {
        return dao.findAll();
    }

    /**
     * 使用redis缓存查数据
     * @return
     */
    @Override
    public String findAllredis() {
        //从redis中查询数据,获取redis的客户端连接
        Jedis jedis = Jedisutils.getJedis();
        String p = jedis.get("province");
        //判断p是否为空
        if(p == null || p.length() == 0){
            //缓存中无数据,从数据库中查询
            List<Province> ps = dao.findAll();
            //将该list序列化为json
            ObjectMapper mapper = new ObjectMapper();
            try {
                p = mapper.writeValueAsString(ps);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
            //将数据存入redis中
            jedis.set("province",p);
            jedis.close();//归还连接
        }else{
            System.out.println("缓存中有数据,查询缓存");
        }
        return p;
    }
}
相关推荐
莳花微语15 小时前
磐维数据库的权限使用
数据库
win x16 小时前
Redis 主从复制
java·数据库·redis
周末吃鱼16 小时前
MySQL CTE:SQL查询新模式
数据库·sql·mysql
木风小助理16 小时前
解读 SQL 累加计算:从传统方法到窗口函数
大数据·数据库·sql
8号看台17 小时前
ORA-01017: 用户名/口令无效; 登录被拒绝
数据库·oracle
计算机毕设VX:Fegn089517 小时前
计算机毕业设计|基于springboot + vue在线音乐播放系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
qq_25183645717 小时前
基于java Web 个人网站系统设计与实现
java·开发语言·数据库
计算机毕设VX:Fegn089517 小时前
计算机毕业设计|基于springboot + vue博物馆展览与服务一体化系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
龙亘川17 小时前
【课程5.3】功能设计:城管核心指标与设施分布(处置效率、违建数量等指标定义)
数据库·oracle·智慧城市·一网统管ai平台