zoukankan      html  css  js  c++  java
  • Redis

    为什么用redis

    解决服务器CPU内存压力

    方案一、存在Cookie中

    此种方案需要将Session数据以Cookie的形式存在客户端,不安全,网络负担效率低

    方案二、存在文件服务器或者是数据库里

    此种方案会导致大量的IO操作,效率低.

    方案三、Session复制

    此种方案会导致每个服务器之间必须将Session广播到集群内的每个节点,Session数据会冗余,节点越多浪费越大,存在广播风暴问题.

    方案四、存在Redis中

    1. 目前来看,此种方案是最好的。将Session数据存在内存中,每台服务器都从内存中读取数据,速度快,结构还相对简单

    2. 将活跃的数据缓存到Redis中,客户端的请求先打到缓存中来获取对应的数据,如果能获取到,直接返回,不需要从MySQL中读取。如果缓存中没有,再从MySQL数据库中读取数据,将读取的数据返回并存一份到Redis中,方便下次读取

    3. 适用于对数据高并发的读写、海量数据的读写、对数据高可扩展性的

    redis简介及安装

    简介

    Redis是一个开源的key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。

    安装

    https://www.cnblogs.com/marvinn/p/11081106.html

    redis的五大数据类型

    基本操作

    key

    • String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value

    • String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

    • String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

    常用操作

    list

    • 单键多值

    • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

    • 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

    Set

    • Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的
    • Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)

    Hash

    现有一个JavaBean对象,在Redis中如何存?

    Zset

    • Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了

    • 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

    redis的相关配置

    https://blog.csdn.net/P_ning/article/details/106241421

    redis的Java客户端

    1. 导入jar包
      Commons-pool-1.6.jar
      Jedis-2.1.0.jar

    2. 注意事项

    • 禁用Linux的防火墙:Linux(CentOS7)里执行命令 : systemctl stop firewalld.service

    • redis.conf中注释掉bind 127.0.0.1 ,然后 protect-mode no

    1. 测试是否联通
    package com.atguigu.test;
    
    
    
    import redis.clients.jedis.Jedis;
    
    
    
    public class Test {
    
    
    
         public static void main(String[] args) {
    
              
    
              Jedis jedis = new Jedis("192.168.16.128",6379);
    
              String result = jedis.ping();
    
              System.out.println(result);
    
              jedis.set("a", "a");
    
              String a = jedis.get("a");
    
              System.out.println(a);
    
              jedis.close();
    
         }
    
    }
    
    
    
    1. 完成一个手机验证码功能
    • 导入jar包

    • index.jsp

    1、index.jsp中
    插入一些文件
    <script  src="/Verify_code/static/jquery/jquery-3.1.0.js" 
    ></script>
    
    <link href="/Verify_code/static/bs/css/bootstrap.min.css" 
    rel="stylesheet" />
    
    <script  src="/Verify_code/static/bs/js/bootstrap.min.js"   
    ></script>
    
    主体中
    <div class="container">//1、boostrap中的样式,可以用来控制是否在12个格子中
    
              <div class="row">//2、与container配合减少一些空白
    
                  <div id="alertdiv" class="col-md-12">//一行12个
    
                        <form class="navbar-form navbar-left"><u>role</u>="search" id="codeform">
    
                         <div class="form-group">
    
                           <input type="text" class="form-control" <u>placeholder</u>="填写手机号" name="phone_no">//加入form-control会使用boostrap自带的input框
    
                           <button type="button" class="btn btn-default" id="sendCode">发送验证码</button>//name可重复、value不可重复
    
                         <br><font id="countdown" color="red" ></font> <br>
    
                         <input type="text" class="form-control" <u>placeholder</u>="填写验证码" name="verify_code">
    
                         <button type="button" class="btn btn-default" id="verifyCode">确定</button>
    
                         <font id="result" color="green" ></font><font id="error" color="red" ></font>
    
                         </div>
    
                       </form>
    
        </div>
    
       </div>
    
      </div>
    
    
    
    1、https://blog.csdn.net/weixin_42097173/article/details/80381896</u>
    
    2、https://www.cnblogs.com/olivertian/p/11119784.html</u>
    
    3、https://blog.csdn.net/wem603947175/article/details/83004364</u>
    
    javascript中
    
    var t=120;//设定倒计时的时间 
    var interval;
    
    function refer(){  
        $("#countdown").text("请于"+t+"秒内填写验证码 "); // 显示倒计时 
        t--; // 计数器递减 
        if(t<=0){
        	clearInterval(interval);
        	$("#countdown").text("验证码已失效,请重新发送! ");
        }
    } 
    
    $(function(){//整个页面加载完成后
    	$("#sendCode").click( function () {//绑定发送验证码按钮
    		   $.post("/Verify_code/CodeSenderServlet",$("#codeform").serialize(),function(data){//1、-跳转访问路径、-form表单中信息序列化信息、反应(传回来的信息)
    	    	 	if(data=="true"){//2、定时器倒计时
    	    		 	t=120;
    	    		 	clearInterval(interval);
    	    		 	interval= setInterval("refer()",1000);//启动1秒定时  
    	   		 }else if (data=="limit"){
    	   			clearInterval(interval);
    	   			$("#countdown").text("单日发送超过次数! ")
    	   		 }
    		  });   
        });
    	
    	$("#verifyCode").click( function () {//绑定验证确定按钮
    		   $.post("/Verify_code/CodeVerifyServlet",$("#codeform").serialize(),function(data){
    	    	 	if(data=="true"){
    	    		 	$("#result").attr("color","green");//3、设置或返回备选元素的属性或值
    	    		 	$("#result").text("验证成功");
    	    		 	clearInterval(interval);
    	    		 	$("#countdown").text("");
    	   		}else{
    	    		 	$("#result").attr("color","red");
    	    		 	$("#result").text("验证失败");
    	   		}
    		  });   
        });
    	
    	
    });
    
    1、<u>https://www.cnblogs.com/webapi/p/10550185.html</u>
    
    2、<u>https://blog.csdn.net/YDesire/article/details/81124331</u>
    
    3、<u>https://www.cnblogs.com/blmlove/p/12701722.html</u>
    
    2、CodeSenderServlet
    
    @WebServlet("/CodeSenderServlet")
    
    public class CodeSenderServlet extends HttpServlet {
    
          private static final long serialVersionUID = 1L;
    
           
    
        /**
    
         * @see HttpServlet#HttpServlet()
    
         */
    
          public CodeSenderServlet() {
    
            super();
    
            // TODO Auto-generated constructor stub
    
          }
    
          private String getCode(int length) {
    
              String code = "";
    
              Random random = new Random();
    
              for(int i = 0; i < length; i++) {
    
                  int rand = random.nextInt(10);//1、生成随机数字
    
                  code += rand;
    
              }
    
              return code;
          }
    
         /**
    
          * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    
          */
    
         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //获取手机号
                String phone_no = request.getParameter("phone_no");
                //获取验证码
                 String code = getCode(6);
                 //拼接key
                 String codeKey = "Verify_code:" + phone_no + ":code";//Verify_code:12345:code
                String countKey = "Verify_code:" + phone_no + ":count";
                 Jedis jedis = new Jedis("192.168.16.128", 6379);
                //判断发送验证码的次数
                String count = jedis.get(countKey);
                if(count == null) {
                //代表第一次
                jedis.setex(countKey, 24*60*60, "1");
    
              }else if(Integer.parseInt(count) <= 2) {
    
                  jedis.incr(countKey);
    
              }else if(Integer.parseInt(count) > 2) {
    
                  response.getWriter().print("limit");
    
                  jedis.close();
    
                  return ;
    
              }
    
              
    
              //向<u>redis</u>中进行存储,以手机号为键,以验证码为值
    
              jedis.setex(codeKey, 120, code);
    
              jedis.close();
    
              response.getWriter().print(true);
    
              
    
         }
    
    }
    
    
    
    1、https://www.cnblogs.com/hm1990hpu/p/8875928.html</u>
    
    
    
    
    
    3、CodeVerifyServlet
    
    @WebServlet("/CodeVerifyServlet")
    
    public class CodeVerifyServlet extends HttpServlet {
    
         private static final long serialVersionUID = 1L;
    
           
    
        /**
    
         * @see HttpServlet#HttpServlet()
    
         */
    
        public CodeVerifyServlet() {
    
            super();
    
            // TODO Auto-generated constructor stub
    
        }
    
         /**
    
          * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    
          */
           protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
              //获取验证码和手机号
    
              String phone_no = request.getParameter("phone_no");
    
              String verify_code = request.getParameter("verify_code");
    
              //拼接key
    
              String codeKey = "Verify_code:" + phone_no + ":code";
    
              //从<u>redis</u>中获取手机号所对应的验证码
    
              Jedis jedis = new Jedis("192.168.16.128", 6379);
    
              String code = jedis.get(codeKey);
    
              if(code.equals(verify_code)) {
    
                  response.getWriter().print(true);
    
              }
    
              jedis.close();
    
              
    
         }
    
    }
    
  • 相关阅读:
    xdoj1194----(bsgs-用数组实现链表 真的是好啊)
    hdoj-4417(做法二 树状数组离线解法,对所有的查询先保存进行排序后有序的查询) 好腻害!
    线段树专题2-(加强版线段树-可持续化线段树)主席树 orz! ------用于解决区间第k大的问题----xdoj-1216
    线段树专题1(用于解决区间问题)
    ccf-170902-公共钥匙盒(模拟)
    字典(NSDictionary)的使用
    ios 加载资源中的Html
    iOS 使用自定义手势屏蔽按钮解决方法/UITapGestureRecognizer屏蔽Button
    有时UIGestureRecognizer手势识别不出来问题分析及方案
    XCode的一些调试技巧
  • 原文地址:https://www.cnblogs.com/suit000001/p/13356452.html
Copyright © 2011-2022 走看看