Blogger Information
Blog 7
fans 0
comment 0
visits 10755
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Redis 缓存实现存储和读取历史搜索关键字
布丁
Original
856 people have browsed it

一、本案例涉及知识

  1. Layui
  2. Redis
  3. Vue.js
  4. jQuery Ajax

二、效果图

搜索并记录关键字

三、功能实现

(一)使用 Layui 的样式构建页面
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Redis应用 - 搜索历史</title>
  6. <!-- 引入 Layui CSS -->
  7. <link rel="stylesheet" href="css/layui.css">
  8. </head>
  9. <body>
  10. <div class="layui-form" style="width: 50%;margin-top: 20px;" id="app">
  11. <div class="layui-form-item">
  12. <label class="layui-form-label"></label>
  13. <div class="layui-input-block">
  14. <input type="text" class="layui-input">
  15. </div>
  16. </div>
  17. <div class="layui-form-item">
  18. <label class="layui-form-label"></label>
  19. <div class="layui-input-block">
  20. <button class="layui-btn">搜索</button>
  21. </div>
  22. </div>
  23. <div class="layui-form-item">
  24. <label class="layui-form-label"></label>
  25. <div class="layui-input-block">
  26. 搜索历史
  27. </div>
  28. </div>
  29. <div class="layui-form-item">
  30. <label class="layui-form-label"></label>
  31. <div class="layui-input-block">
  32. <span class="layui-badge layui-bg-gray" style="margin-left: 5px;">PHP</span>
  33. <span class="layui-badge layui-bg-gray" style="margin-left: 5px;">JavaScript</span>
  34. </div>
  35. </div>
  36. </div>
  37. <!-- 引入 jQuery -->
  38. <script src="js/jquery-3.5.1.min.js"></script>
  39. <!-- 引入 Layui JS -->
  40. <script src="js/layui.js"></script>
  41. <!-- 引入 Vue.js -->
  42. <script src="js/vue.min.js"></script>
  43. </body>
  44. </html>
(二)点击搜索时储存本次搜索的关键字

给文本框添加 Vue 双向绑定

  1. <input type="text" class="layui-input" v-model="keyword">

给搜索按钮添加点击事件

  1. <button class="layui-btn" @click="addHistory()">搜索</button>
  1. <script type="text/javascript">
  2. var vm = new Vue({
  3. el: "#app",
  4. data: {
  5. keyword: ""
  6. },
  7. methods: {
  8. addHistory: function () {}
  9. }
  10. });
  11. </script>

当文本框被输入内容后,输入的内容将绑定给 Vue 中 datakeyword 字段。

点击搜索按钮时,触发 addHistory() 函数,此函数将输入的内容发送给 PHP ,PHP 操作 Redis 将内容进行缓存。

addHistory() 函数中:

  1. addHistory: function () {
  2. $.ajax({
  3. url: "history.php",
  4. type: "GET",
  5. data: {type: 'add', keyword: this.keyword},
  6. success: function () {
  7. // 请求成功后刷新本页面
  8. window.location.reload();
  9. }
  10. });
  11. }

data 中传值两个字段,type 表示本次请求的类型,其中 add 代表往缓存中添加关键字,read 代表从缓存中读取关键字。

history.php 中:

  1. <?php
  2. $redis = new Redis();
  3. $con = $redis->connect('localhost', 6379);
  4. if (!$con) {
  5. echo 'Redis连接失败';
  6. }
  7. // 接收请求类型参数的值
  8. $type = $_GET['type'];
  9. // 模拟用户的id,因为每个用户搜索的内容不同,需要进行区分
  10. $user_id = 'user-1';
  11. // 如果请求类型为添加
  12. if ($type == 'add') {
  13. // 接收输入的关键字
  14. $keyword = $_GET['keyword'];
  15. // 读取当前用户队列中存储的关键字个数,即队列的长度
  16. $len = $redis->llen($user_id);
  17. // 如果个数大于等于 5 个,则删除最开始搜索的关键字,加入最新搜索的关键字
  18. if ($len >= 5) {
  19. // 移除队列左侧的第一个关键字
  20. $redis->lPop($user_id);
  21. // 在队列右侧加入新的关键字
  22. $redis->rPush($user_id, $keyword);
  23. } else {
  24. // 不多于 5 个直接在队列右侧加入新的关键字
  25. $redis->rPush($user_id, $keyword);
  26. }
  27. }
(三)读取并展示历史搜索的关键字

第二步中加入了当请求添加缓存成功后会刷新页面的代码,

  1. window.location.reload();

在这个基础上,我们希望刷新的同时执行另一个 Ajax 请求从 PHP 中操作 Redis 将所有的历史搜索关键字读取出来并在页面中展示。

所以在 Vue 中加入页面加载完成自动调用getHistory()函数:

  1. methods: {
  2. getHistory: function () {},
  3. addHistory: function () {
  4. $.ajax({
  5. url: "history.php",
  6. type: "GET",
  7. data: {type: 'add', keyword: this.keyword},
  8. success: function () {
  9. window.location.reload();
  10. }
  11. });
  12. }
  13. },
  14. // 页面加载完成自动调用 getHistory()
  15. created () {
  16. this.getHistory();
  17. }

getHistory()函数中:

  1. getHistory: function () {
  2. $.ajax({
  3. url: "history.php",
  4. type: "GET",
  5. data: {type: 'read'},
  6. success: function (r) {
  7. // JSON.parse(r) 将读取到的 json 字符串转为 json 对象
  8. vm.history = JSON.parse(r);
  9. }
  10. });
  11. }

data 中传值一个字段,read 代表从缓存中读取关键字,请求成功后将返回的结果赋值给 Vue 中 datahistory 字段。

history.php 中添加读取操作:

  1. // 如果请求类型为读取
  2. if ($type == 'read') {
  3. // 从队列左侧依次取出 5 个关键字
  4. $history = $redis->lrange($user_id, 0, 4);
  5. // 转为 json 格式的数据并输出到页面中供 Ajax 使用
  6. echo json_encode($history, JSON_UNESCAPED_UNICODE);
  7. }

将读取到的数据成功赋值给 Vue 中 datahistory 字段后,页面中即可将数据循环输出展示:

  1. <span class="layui-badge layui-bg-gray" v-for="item in history" style="margin-left: 5px;">{{item}}</span>

连贯过程为:用户输入关键字并点击搜索按钮,Ajax 请求 PHP 操作 Redis 进行数据缓存且缓存成功后刷新页面,页面刷新后自动调用函数执行 Ajax 请求 PHP 操作 Redis 进行缓存数据的读取并返回于页面中同时进行渲染展示。

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post