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;
    }
}
相关推荐
曹天骄11 小时前
基于 Cloudflare Worker 构建分布式测速调度系统:KV 与 D1 数据层设计实战教程
分布式·缓存
三水不滴11 小时前
Redis 持久化机制
数据库·经验分享·redis·笔记·缓存·性能优化
lusasky12 小时前
Claude Code v2.1.0+ 版本集成LSP
大数据·数据库·人工智能
挺6的还12 小时前
16.哨兵(sentinel)
redis
凯子坚持 c12 小时前
Qt常用控件指南(7)
服务器·数据库·qt
diediedei12 小时前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
气可鼓不可泄12 小时前
将dmpython 封装在容器镜像里
数据库·python
m0_5613596712 小时前
超越Python:下一步该学什么编程语言?
jvm·数据库·python
mango_mangojuice12 小时前
Linux学习笔记 1.19
linux·服务器·数据库·笔记·学习
TGITCIC13 小时前
丢掉向量数据库!推理型 RAG 正在重新定义长文档问答的准确边界
数据库·ai大模型·推理·ai搜索·大模型ai·rag增强检索·ai检索