[Redis1] 일반적인 작업, 지속성, Jedis


1. 설치 : .conf로드

WeChat Moments 데이터는 전화기의 메모리에 캐시되고 많은 수의 비디오 글 머리 기호, 즉 방대한 데이터가 캐시 된 다음 관계형 데이터베이스에 기록됩니다. 다음 저장 파일은 처음 사용할 수 없습니다. 아래의 파란색 가로줄은 바로 가기이며 끝에 .conf 파일이 추가됩니다. Mysql의 기본값은 포트 3306이고 tomcat의 기본값은 포트 8080입니다. redis-cli.exe 명령 줄 클라이언트는 사용하기 쉽지 않습니다. 그래픽 클라이언트를 사용하십시오.
여기에 사진 설명 삽입
Nosql 제품은 다음과 같으며 Redis의 단점은 5 가지 유형의 값이 있고 고정 된 구조가 없다는 것입니다. 바이너리 트리 쿼리처럼 분산 된 HBase는 효율성이 높고 데이터가 지속적으로 추가되어 강력한 확장 성을 가지고 있습니다. MongoDB는 식료품 가방과 같으며 카테고리로 구분할 필요가 없습니다.
여기에 사진 설명 삽입
여기에 사진 설명 삽입
여기에 사진 설명 삽입
여기에 사진 설명 삽입

2. 일반적인 작업 : 설정 / 가져 오기, 푸시 / 팝, 추가 / 제거

여기에 사진 설명 삽입
여기에 사진 설명 삽입
여기에 사진 설명 삽입
요소가 반복되지 않기 때문에 무질서 할 수 있습니다. 주문을 다시 주문하십시오.
여기에 사진 설명 삽입
여기에 사진 설명 삽입
점수는 반복 가능한 점수라는 것을 이해하십시오.
여기에 사진 설명 삽입
여기에 사진 설명 삽입

3. 지속성 전략 : .aof 및 .rdb 파일이 삭제되면 데이터베이스의 데이터가 사라집니다.

다음 RDB에서 900 초는 15 분으로, 예를 들어 0-15 분에 2 번 작업하고 하드 디스크를 저장하기 위해 사진을 한 번 촬영합니다. 그러나 15 ~ 27 분에 두 번 운영 (900 1 저장 전략에 따름)이 때 redis가 충돌하여 사진을 찍고 저장하는 데 15 ~ 30 분이 걸렸기 때문에 2 개의 데이터가 손실되었습니다. . 따라서 자주 사용하지 않는 작업은 데이터를 잃게됩니다.

다음 AOF에서 로그를 작성하는 것은 전체 사진을 기록하는 것이 아니라 한 단계를 기록하는 것 (더 빠른 저장)이므로 读取慢因为要从头看到尾전체 프로세스가 연결될 수 있습니다. AOF只能三者选其一,不像RDB三个策略都在线(默认开启),AOF是RDB(会丢数据)的补丁. redis_windows.conf에서 appendonly를 yes로 수정하여 redis_windows.conf 파일 이름이 이전에 바로 가기 대상에 추가되었습니다.

장면 : 10 초마다 2000 회 (총 8 * 2000 = 16000 회), 분당 12000 회 60 초 (현재 RDB는 사진을 찍고 20 초를 찍을 시간이 없습니다. 붙어있을 것입니다). RDB를 먼저 사용하는 이유는 무엇입니까? 읽기가 빠르기 때문입니다.
여기에 사진 설명 삽입
여기에 사진 설명 삽입

4. Jedis : 자바 프로그램이 redis, ResourceBundle.getBundle을 연결합니다.

여기에 사진 설명 삽입

package com.itheima01.jedis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisDemo {
    
       
    @Test
    public void method01(){
    
           
        String host = "127.0.0.1"; 
        int port = 6379;
        Jedis jedis = new Jedis(host, port);  //1. 创建连接,不用连接池       
        jedis.set("book","thinking");   //2. 访问redis
        jedis.hset("student","name","zs");        
        jedis.close();  //3. 关闭连接
        System.out.println("测试");
   }
    @Test
    public void method02(){
    
           
        String host = "127.0.0.1";
        int port = 6379;
        JedisPoolConfig config = new JedisPoolConfig(); //连接池
        config.setMaxTotal(5); //最大连接数
        config.setMaxWaitMillis(2000); // 最长等待时间
        config.setMaxIdle(2); // 最大空闲数:最多允许两个连接不干活,超过两个会被回收掉,达到释放内存目的
        
        JedisPool pool = new JedisPool(config, host, port); //1. 初始化连接池        
        Jedis jedis = pool.getResource(); //2. 获取连接        
        String book = jedis.get("book"); //3. 访问redis
        System.out.println(book);  //thinking      
        jedis.close();  //4. 将连接还给连接池
        pool.close(); // 销毁连接池,一般只有应用关闭时才用
    }
    @Test
    public void method03(){
    
     //测试封装的框架
        Jedis jedis = JedisUtil.getResource();
        String book = jedis.get("book");
        System.out.println(book + "-------");
        jedis.close();
    }
}
package com.itheima01.jedis;
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;
import java.util.ResourceBundle;

public class JedisUtil {
    
    
    private static JedisPool pool;
   /* static{
        String host = "127.0.0.1";
        int port = 6379;
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(5);  //最大连接数
        config.setMaxWaitMillis(2000);  // 最长等待时间
        config.setMaxIdle(2);  // 最大空闲数
        pool = new JedisPool(config, host, port);
    }*/
    
	//如下可替代如上 
    /*static{
        Properties p = new Properties();
        InputStream is = JedisUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
        try {
            p.load(is);
            String host = p.getProperty("host");
            Integer port = Integer.parseInt(p.getProperty("port"));
            Integer maxTotal = Integer.parseInt(p.getProperty("maxTotal"));
            Integer maxWaitMillis = Integer.parseInt(p.getProperty("maxWaitMillis"));
            Integer maxIdle = Integer.parseInt(p.getProperty("maxIdle"));
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(maxTotal); //最大连接数
            config.setMaxWaitMillis(maxWaitMillis); // 最长等待时间
            config.setMaxIdle(maxIdle); // 最大空闲数
            pool = new JedisPool(config, host, port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }*/
    
    //如下可替代如上 
    static{
    
    
        /*
        * ResourceBundle : 资源堆
        *    1. 底层: 类加载器  -> 文件必须放在src下
        *    2. 只能加载properties文件 -> 文件的后缀名.properties不要写。
        *       用来替代Properties成为 properties文件专属解析类
        * */
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");
        String host = bundle.getString("host");
        Integer port = Integer.parseInt(bundle.getString("port"));
        Integer maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
        Integer maxWaitMillis = Integer.parseInt(bundle.getString("maxWaitMillis"));
        Integer maxIdle = Integer.parseInt(bundle.getString("maxIdle"));
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal); //最大连接数
        config.setMaxWaitMillis(maxWaitMillis); // 最长等待时间
        config.setMaxIdle(maxIdle); // 最大空闲数
        pool = new JedisPool(config, host, port);
    }
    public static Jedis getResource(){
    
    
        Jedis jedis = pool.getResource();
        return jedis;
    }
}
//jedis.properties文件 
host = 127.0.0.1
port = 6379
maxTotal = 5
maxWaitMillis = 2000
maxIdle = 2

5. Case_Friend 목록 : json = om.

여기에 사진 설명 삽입
여기에 사진 설명 삽입
여기에 사진 설명 삽입

//index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        $(function () {
     
      //页面加载事件
            $.get("/FriendServlet","",function (data) {
     
      
                // console.log(data)
                var content = ""
                $(data).each(function (index,element) {
     
     
                    content += "<li>" + element.name + "</li>"
                })
                $("#myid").html(content) //因为<li>是html
            },"json")
        })
    </script>
</head>

<!--1111111111111111111111111111111111111111111111111111111111111111-->
<body>
        <ul id="myid">
        </ul>
</body>
</html>

여기에 사진 설명 삽입
여기에 사진 설명 삽입
여기에 사진 설명 삽입

package com.heima.example.web;
import com.heima.example.service.FriendService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/FriendServlet")
public class FriendServlet extends HttpServlet {
    
      
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request, response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        FriendService service = new FriendService(); //调用service层代码
        String json = service.findAllFriend();
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print(json);
    }
}
package com.heima.example.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.example.bean.Friend;
import com.heima.example.dao.FriendDao;
import com.itheima01.jedis.JedisUtil;
import com.sun.org.apache.bcel.internal.generic.NEW;
import redis.clients.jedis.Jedis;
import java.util.List;
/*
*  service层: 业务逻辑 + 缓存 cache
*     弊端: 数据不更新 (查询走缓存, 如果执行增删查, 重新查询数据库,更新缓存)
*  如上括号里的解决方案也会存在缓存延迟的情况(如朋友圈删除动态有时也能看见)
*  朋友圈不是实时同步,如果实时同步对服务器来说压力大,好友列表的在线状态是实时同步的,用心跳长连接
*/
public class FriendService {
    
     //service文件夹下
    public static final String FRIEND_LIST_CACHE = "example_friend_list"; 
//选中再ctrl + shift + u转为大写,"example_friend_list"变量改了,下面FRIEND_LIST_CACHE常量不用改
    public String findAllFriend() throws JsonProcessingException {
    
            
        Jedis jedis = JedisUtil.getResource();
        String json = jedis.get(FRIEND_LIST_CACHE); //直接从缓存里取
        
        if(json == null){
    
     //就从mysql数据库中取                      
            FriendDao dao = new FriendDao();
            List<Friend> list = dao.findAll(); 
                        
            ObjectMapper om = new ObjectMapper();
            json = om.writeValueAsString(list); //list转换为json            
            jedis.set(FRIEND_LIST_CACHE,json); //记得往缓存里放一份json即字符串
            System.out.println("从mysql中查");
        }else{
    
    
            System.out.println("从redis中查");
        }
        jedis.close(); //记得还给连接池,不然5个用完就崩了
        return json;
    }
}
package com.heima.example.dao;
import com.heima.example.bean.Friend;
import com.heima.example.utils.JdbcUtil;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;

public class FriendDao {
    
      //Dao文件夹下
    public List<Friend> findAll() {
    
    
        String sql = "select * from user";
        JdbcTemplate template = JdbcUtil.getTemplate();
        List<Friend> list = template.query(sql, new BeanPropertyRowMapper<>(Friend.class));
        return list;
    }
}
package com.heima.example.bean;
 
public class Friend {
    
     //bean文件夹下
    private Integer id;
    private String name;
    private String password;
    @Override
    public String toString() {
    
    
        return "Friend{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }    
    public Integer getId() {
    
    
        return id;
    }    
    public void setId(Integer id) {
    
    
        this.id = id;
    }
    public String getName() {
    
    
        return name;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    public String getPassword() {
    
    
        return password;
    }
    public void setPassword(String password) {
    
    
        this.password = password;
    }
}

여기에 사진 설명 삽입
여기에 사진 설명 삽입
스테이션 B / Zhihu / WeChat 공식 계정 : 코드 파밍 프로그래밍 기록
여기에 사진 설명 삽입

추천

출처blog.csdn.net/weixin_43435675/article/details/108687436