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;
    }
}
相关推荐
冉冰学姐8 分钟前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly15 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客23 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.27 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐31 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999934 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
fengxin_rou1 小时前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
全栈前端老曹2 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集