PHP通过redis存储并展示查询记录

2017-09-05

工作遇到的小问题

嗨呀!既想接点独立的任务又担心自己做不了的心情真的好气啊!虽然技术深度不一定很高,但是独立的去撰写代码比小修小补带来的启发大上好多呢。上周例会中,主管交给了一个任务:在项目中给各个游戏查询log的页面中添加查询历史纪录的功能,规则如下:

一、要记录的查询(记录到redis中):
  1. 字符串查找-grep 选择“正则表达式”
  2. 字符串查找的内容超过两行
二、要求
  1. 按时间逆序列在对应查找功能的右侧,建议以select标签的形式列出(size属性设置一下),选中某个记录时,自动粘贴到文本框中
  2. 加上数量限制50

又激动又紧张,当时脑海里闪过输入检测、字符串匹配啥的,冷静下来发现还是一个逻辑比较清晰简单的问题,对我来说难点就在与“获知”达成各个步骤的方法。

在了解这个页面的大致功能后,我梳理了一下大体的思路:

  1. 在页面表单提交的数据得到简单的处理后,检查是否符合存储条件,如果是则存入redis数据库。
  2. 在加载页面前从redis中获取数据放入view_data[]中传入页面
  3. 在存取数据中怎么样确定正确的顺序并去除重复的数据保留最新的输入
  4. 页面的展示采用select标签、foreach循环,点击时复制粘贴使用JavaScript函数

需要解决的各个小问题有很多,比如:
在数据库方面,redis采用什么数据类型,存取各自使用什么方法
在页面方面,怎么样写精简有质量的js函数以及正确的for循环短标签语法
在逻辑方面,各个处理过程放在什么地方最合适

很快的理清思路不代表可以很快的实现,特别是在基础不扎实的情况下,很多时候我不知道错在什么地方,一旦轻举妄动,debug将不是修补而是重建。

阶段一

回头去想自己,因为仅接触过一次redis,还没有从殊相抽象到共相,我对redis的思绪被这个例子完全限制

$this->redis->hSet('h_1',$key,json_encode($value_1));
$this->redis->hSet('h_2',$key,json_encode($value_2));
$this->redis->hSet('h_3',$key,json_encode($value_3));

我花了半天时间思考如何实现:
从数据库中获取数组的json对象,解码后和新传入的数组合并
先检测是否存在,否插入;有则更新)
如果使用array_unique(),函数会保留的并不是插入在数组最后的最新值,我需要合理的颠倒顺序
如果使用in_array(),则要考虑删除数组中特定值
也许引入时间戳建立索引数组对排序的清晰度有好处

阶段二

总之,繁琐得让我自己都觉得不好,考虑很久并理清思绪后,实现到出现我不知道怎么解决的小bug时,我跟师傅做了交流,师傅做了简单的回应在了解我的需求后,告诉我,这么存:

$this->redis->hSet('h',$value_1,time_1);
$this->redis->hSet('h',$value_2,time_2);
……

取出数据时采用

$this->redis->hSetAll('h');

感觉一语惊醒梦中人,有时候我在想到底是我接受新事物的能力比较差还是如何,我总需要两三个例子我才能更好的理解,虽然现在瞎尝试的勇气大了不少,感觉我对redis的理解一下子进步了一米哈哈。我觉得我运用时间戳算是一个小发挥。现在实现的思路更加清晰,取出时的数据就是一个数组,只需要按时间戳排序,插入时简直仅一行代码简直完美。

在实现了正则后,考虑移植到字符串时,我发现主管的代码很注意复用性,利用标签的类名或id作为js函数的参数,又利用层次在获取标签对象时避免重复撰写代码,具有很高的统一性,我模仿着写了,感觉非常开心,但独自撰写恐怕有困难。

同时,在和主管交流“两行的限制需求时”,得到新要求——数量限制。这时候我发现,虽然hash数据结构在插入时提供了便捷,但是却只能在加载页面前取出数据时才能做数据数量的限制,如果在插入时控制就丢失了hash表结构的优势并产生两次取出操作。虽然无伤大雅,但在整个逻辑上显得不够和谐,我意识到选取的数据结构不够和谐,对于顺序类型的数据hash表确实是一个妥协。这时候主管也提出了list作为表结构的观点。

阶段三

字符串输入的判断在得到主管用explode()的随意一提中,直接用了检测'\n',也算一个小发挥,没有放弃思考。在完成任务后,我决定用list作为表结构再次重写一遍代码,这时候我发现我对redis的理解又进步了十米哈哈。看到各种方法再也不会一个头大。

$this->redis->lrem($function_class,$content,0);
$this->redis->lpush($function_class,$content);
if ($this->redis->lSize($function_class)>=51) {
    $this->redis->rPop($function_class);
}

在此我又学会了list相关的操作方法,开心。难点在Lrem方法,和命令行参数顺序不一致,搞了好久,还以为不能用,此法废了。这时候对于数据的控制在存入前就完成了。

在和师傅交流了两者的优劣后,师傅并没有给出答案,而是在整体上给了建议,将存取各自写成函数,结构更加清晰便于理解,更不影响原先的方法。

总结

在这个过程中,对CodeIgniter的MVC结构更加熟悉,对redis的认识从生搬硬套到可以主动化用,对数据结构的重要性有了更进一步的体会。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 转载地址:http://gnucto.blog.51cto.com/3391516/998509 Redis与Me...
    Ddaidai阅读 21,440评论 0 82
  • “不要给自己设限”,和朋友聚会的那天,他又和我提起了这句话,这让我反思,我真的有给自己设限吗?从工作到学习,从学习...
    记忆教练赵俊祥阅读 167评论 1 0
  • 如果真的存在平行空间,那么会对过去的自己说些什么呢?会迫不及待的告诉自己即将出现的不如意的事?还是告诉自己那...
    f3eda8b6d093阅读 629评论 2 0
  • 作为一名刚刚入门 iOS 开发的人来说,理解并熟练使用 Auto Layhout 非常重要。开始接触自动布局是非常...
    iTychoo阅读 1,335评论 1 0
  • 时间苟延残喘 拖着疲惫得身子 来到世界每一个角落 让每一个活着的人 狼狈不堪,流连忘返 岁...
    梧桐伶仃阅读 127评论 0 1