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;
    }
}
相关推荐
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
IT大白鼠2 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz2 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
全栈弄潮儿²⁰²⁴2 天前
AI Agent 开发实战(30):限流、缓存与成本控制
人工智能·gpt·缓存·agent·限流·agi·成本控制
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安2 天前
MySQL-触发器
数据库·mysql