SESSION存储于redis(CI3)

Stella981
• 阅读 613

CI3的Session的重大改变就是默认使用了原生的Session,这符合Session类库本来的意思,似乎更加合理一些。总体来说,虽然设计理念不同,但为了保证向后兼容性,类库的使用方法与CI2.0的差别不是很大。

###Session 驱动 CI3的Session 类自带了 4 种不同的驱动(或叫做存储引擎)可供使用:

  • files
  • database
  • redis
  • memcached

我以redis为session的存储方案

###错误出现 当我将SESSION进行存储的时候,发现跨页面时,session会丢失。

###定位错误日志

ERROR - 2015-11-04 13:29:34 --> Session: Error while trying to obtain lock for ci_session:26b7716c39e799d7c6eac1357bc3fdd676bb6979

经过代码跟踪,发现错误在这里报出

if ( ! $this->_redis->setex($lock_key, 300, time()))
            {
                log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);
                return FALSE;
            }

####ci官方的意思是

attempts to obtain a lock, in case another request already has it 生成一个锁,防止被重复使用

####那么 setex是啥列? redis官方给出的解释 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。 如果 key 已经存在, SETEX 命令将覆写旧值。

那么这个东西怎么能执行失败呢?不懂。 所以我进入命令行redis-cli

执行:

setex ci_session:26b7716c39e799d7c6eac1357bc3fdd676bb6979:lock 300 ddasda

报错:

(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

无法被保存到磁盘上 网上的解决方案是: 在/etc/sysctl.conf 添加一项 'vm.overcommit_memory = 1' ,然后重启(或者运行命令'sysctl vm.overcommit_memory=1' )使其生效。

网上查了一下,有人也遇到类似的问题,并且给出了很好的分析(详见:http://www.linuxidc.com/Linux/2012-07/66079.htm),简单地说:Redis在保存数据到硬盘时为了避免主进程假死,需要Fork一份主进程,然后在Fork进程内完成数据保存到硬盘的操作,如果主进程使用了4GB的内存,Fork子进程的时候需要额外的4GB,此时内存就不够了,Fork失败,进而数据保存硬盘也失败了。

###最终解决方案: 再redie.conf里,将stop-writes-on-bgsave-error配置的yes=>no

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
springboot+session(redis)(另附上:ip地址无法访问Redis)
springboot的版本:<version2.1.6.RELEASE</version搭建springboot框架涉及到session管理,交给springboot框架管理,同时为了以后分布式或集群等的扩展,故将session存储到Redis数据库中。理解::session交给spring管理,spring将session信息存储到
Easter79 Easter79
3年前
SpringBoot实现分布式session
实现分布式session实现基于redis的分布式session原理基于HttpRequestWapper,对request获取的Session实现类进行替换,即提供一个从redis获取数据的Session实现类依赖引入springbootstarterdatared
Stella981 Stella981
3年前
SpringBoot实现分布式session
实现分布式session实现基于redis的分布式session原理基于HttpRequestWapper,对request获取的Session实现类进行替换,即提供一个从redis获取数据的Session实现类依赖引入springbootstarterdatared
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Stella981 Stella981
3年前
SQLAlchemy 几种查询方式总结
几种常见sqlalchemy查询:    简单查询    print(session.query(User).all())    print(session.query(User.name, User.fullname).all())    print(session.query(User, User.na
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这