分类 redis 下的文章

redis安装phpredis扩展

前面在服务器上安装了Redis,但要想使用还得装一个phpredis扩展。

查看codeigniter 3.1缓存驱动器,找到github托管的代码Redis 服务器和 phpredis 扩展,安装文档install.markdown

pecl安装:

# 更新pecl数据源(不建议执行该操作)
# 见鬼的操作,我一开始是可以安装的,只不过安装失败了,
# 然后尝试以下指令,再次尝试安装,直接找不到包了,pecl命令直接用不了了。
pecl channel-update pecl.php.net

#安装pecl
pecl install redis
# 若pecl没有问题的话,可以直接跳到 安装igbinary(安装redis会报错)。
# 我的机子是缺这个库的,不缺igbinary,pecl又没问题,应该会直接安装成功。
# 我的pecl有问题,提示:No releases available for package "pecl.php.net/redis"
# 各种查询兜兜转转的,让我升级php版本,做不了,可能之后会考虑,现在我只想能够使用

# 直接下载压缩包,然后安装
curl 'https://pecl.php.net/get/redis-4.1.1.tgz' -o redis-4.1.1.tgz
# 我用的是wget 'https://pecl.php.net/get/redis-4.1.1.tgz'
pecl install redis-4.1.1.tgz

# 报错
checking for igbinary includes... configure: error: Cannot find 
ERROR: `/tmp/pear/temp/redis/configure --enable-redis-igbinary=yes --enable-redis-lzf=yes' failed

# 当时没有立即去查问题解决方案,因为我看到安装文档下面有
# RHEL / CentOS Installation of the php-pecl-redis package, from the EPEL repository:
yum install php-pecl-redis

# 抱着试试看态度执行了一下,OK了,但怎么都找不到扩展文件so,也没办法添加使用。不太懂安装到那里去了。
# 没办法,回到 pecl install redis。
# 根据错误提示:checking for igbinary includes... configure: error: Cannot find igbinary.h 找解决方案。

# 安装igbinary,它也是php的一个扩展,但前面碰到了pecl用不了的问题,只能下载包,然后解压,编译安装。
curl 'https://github.com/igbinary/igbinary/archive/master.zip' -o igbinary.zip
unzip igbinary.zip
cd igbinary
phpize
./configure
make
make test
make install

# 一路畅通!
# 配置php.ini,使igbinary生效。记得重启php-fpm(如果没有这个服务,重启服务器service httpd/nginx restart)
; Load igbinary extension
extension=igbinary.so
; Use igbinary as session serializer
session.serialize_handler=igbinary
; Enable or disable compacting of duplicate strings
; The default is On.
igbinary.compact_strings=On

# 然后再次安装redis
pecl install redis-4.1.1.tgz

# 成功!
# 再次配置php.ini,添加redis.so
extension="redis.so"

# 重启服务器
service httpd/nginx restart
echo phpinfo();
# CTRL + F redis 看到模块已经安装好了,或者php -m也可以看到安装好的模块。

附:
igbinary github

redis远程连接方法

远程连接方法

redis-cli -h 138.138.138.138  -p 6379 -a password
#或者害怕命令传输不安全,可以先不输入密码,登录后在auth password
redis-cli -h 138.138.138.138  -p 6379

但本地依旧连接不上。

排查问题:
阿里云服务器端口设置:没问题。
防火墙:没问题。
redis本身:未检查

网上搜了一下redis远程连接的问题,

解决方案是:

修改配置文件redis.conf

#bind 127.0.0.1
#修改成
bind 0.0.0.0
#protected-mode yes
#修改成
protected-mode no

然后重启redis

pkill redis / service redis stop
service redis start

ok,可以连接了!

redis设置密码后,关闭服务的问题

转自Redis设置密码之后,关闭服务的问题

redis设置密码config set requirepass password之后,任何操作指令都需要验证密码。包括关闭服务时,也会授权失败,无法关闭服务。以下为转载内容:

Redis安装之后,如果设置了密码,需要在关闭服务的时候也提供密码,否则无法关闭服务,可以直接通过修改/etc/init.d/redis启动脚本解决。Redis服务的启动和关闭脚本,只需要在关闭的脚本中添加如下的内容PASSWORD=$(cat $CONF|grep '^\s*requirepass'|awk '{print $2}'|sed 's/"//g'),然后在服务关闭命令中,添加密码就可以了,

EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/etc/redis/redis.conf"
REDISPORT="6379"
PASSWORD=$(cat $CONF|grep '^\s*requirepass'|awk '{print $2}'|sed 's/"//g')
if [ -z $PASSWORD ]
then 
    $CLIEXEC -p $REDISPORT shutdown
else
    $CLIEXEC -a $PASSWORD -p $REDISPORT shutdown
fi
#$CLIEXEC -a $PASSWORD -p $REDISPORT shutdown

这个方法在开启和关闭的时候,都会自动获取配置文件中设置的密码,然后在参数中携带该密码。所以起作用的前提是,redis.conf文件中的字段requirepass已经设置了值(有点svn的即视感)。
有个缺点:开启和关闭它都去携带了密码,开启是没有必要携带的,并且在脚本中携带密码会有warning提醒,很烦人。

另附一简单暴力关闭方法

pkill redis / kill -9 pid
# 如何未将redis设置成服务,除了修改配置文件外,也可以通过以下命令让此进程转换为后台进程,不占用shell的服务。
redis-server &

安装redis(linux版本)

转自博客:Redis安装与卸载

安装redis

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
$ tar xzf redis-5.0.0.tar.gz
$ cd redis-5.0.0
$ make

在linux下每次编译软件完成后,都会提示make test,测试一下。

就忍不住执行了一下,出错了。。

cd src && make test
make[1]: Entering directory `/usr/local/redis/src'
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] Error 1
make[1]: Leaving directory `/usr/local/redis/src'
make: *** [test] Error 2

缺少tcl,安装tcl

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
sudo tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/
cd  /usr/local/tcl8.6.1/unix/
sudo ./configure
sudo make
sudo make install 

再次make test,好了,满屏刷的都是ok。

之后可以直接src/redis-server启动,跟Windows一样,出现图形版本信息界面。然后再启动另一个客户端,src/redis-cli启动命令行。

可以用server-cli shutdown指令关闭redis服务。

配置后台运行(Windows系统是变成本地服务)

修改redis.conf

#daemonize no
#修改为:
daemonize yes

设置redis服务器开机自动启动

要先让redis服务自动启动的话,首先需要在/etc/init.d目录下创建redis的启动脚本。
将redis安装目录下的utils/redis_init_script复制到/etc/init.d目录下,命名为redis(名字简单,使用方便)

cp utils/redis_init_script /etc/init.d/redis

编辑启动文件,修改其中指定的pid和配置文件。

vim /etc/init.d/redis
#PIDFILE=/var/run/redis_${REDISPORT}.pid
#CONF="/etc/redis/${REDISPORT}.conf"
#修改为
PIDFILE=/var/redis/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis.conf"

创建pid目录/var/redis/var/redis/run

创建配置目录/etc/redis,复制配置文件redis.conf/etc/redis

修改配置文件中的pid为前面配置的pid。

vim /etc/redis.conf
#pidfile /var/run/redis_6379.pid
#修改为
pidfile /var/redis/run/redis_6379.pid

至此为止,我们已经可以通过service redis start/stop来启动和关闭redis服务了。

最后只需要通过chkconfig redis on命令来设置开机启动即可。

如果提示redis 服务不支持 chkconfig的话,只需要在/etc/init.d/redis这个启动脚本的第二行后面加上下面的内容即可。

# chkconfig:2345 90 10
#
# description:Redis is a persistent key-value database

我的是支持的,一遍过。

卸载

关闭服务

ps aux|grep redis
kill -9 pid / redis-cli shutdown

需要注意的是,由于我的redis命令都安装到/usr/local/bin目录下面了,并且添加到环境变量PATH里面了,所以可以直接运行。
删除make的时候生成的几个redisXXX的文件

rm -f /usr/local/bin/redis*

顺便也删除掉解压后的文件目录和所有文件

rm -rf redis

这样,redis就卸载完成了。

初探Redis数据库

本文转自最下方文档,是对参考文档的一个摘录。

基本知识

端口:6379
默认16个数据库,下标从0开始
单线程:redis是单线程+io多路复用:检查文件描述的就绪状态
Memchached:多线程+锁
redis数据类型:String set list hash zset

使用场景:

配合关系型数据库做高速缓存

缓存高频次访问的数据,降低数据库io

分布式架构,做session共享

可以持久化特定数据。

利用zset类型可以存储排行榜

利用list的自然时间排序存储最新n个数据

在我看来,redis数据库是对sql数据库的一种补充和优化,针对一些需要频繁操作数据库,高IO的场景,可以用redis进行优化,这样可以降低操作成本。

使用流程

Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis
update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据
并发大的情况下会出现的错误:
为了update先删掉了redis中的该数据,这时候另一个线程执行查询,发现redis中没有,瞬间执行了查询SQL,并且插入到redis中一条数据,回到刚才那个update语句,这个悲催的线程压根不知道刚才那个该死的select线程犯了一个弥天大错!于是这个redis中的错误数据就永远的存在了下去,直到下一个update或者delete。
所以针对并发大的情况,update或者delete要在执行前面流程后,再次删除redis中的数据。

一、优点:

  • 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
  • 操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
  • 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。常规计数: 微博数, 粉丝数。

主要看一下多实用工具,描述了redis实际的一些应用场景。这很重要,不能为了技术而技术,学之前应该清楚地了解到,为什么要学,对现在的应用有多大的帮助,哪些场景确实可以通过这门技术得到优化,用户体验更好,又有哪些场景是不必要的。

二、redis数据库属于NoSql的一种,作为一种键值存储系统,与其他同类型对比:

  1. Redis是键值数据库系统的不同进化路线,它的值可以包含更复杂的数据类型,可在这些数据类型上定义原子操作。
  2. Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度。
  3. 内存数据库的另一个优点是,它与磁盘上的相同数据结构相比,复杂数据结构在内存中存储表示更容易操作。 因此,Redis可以做很少的内部复杂性。

三、Redis数据类型(5种)

  1. 字符串
    就是普通的键值对,SET key value,GET key,DEL key
  2. 散列/哈希
    Redis Hashes是字符串字段和字符串值之间的映射(类似于PHP中的数组类型)。 因此,它们是表示对象的完美数据类型。在Redis中,每个哈希(散列)可以存储多达4亿个键-值对。
  3. 列表
    Redis列表只是字符串列表,按插入顺序排序。可以在列表的头部或尾部添加Redis列表中的元素。列表的最大长度为2^32 - 1个元素(即4294967295,每个列表可存储超过40亿个元素)。
  4. 集合
    Redis集合是唯一字符串的无序集合。 唯一值表示集合中不允许键中有重复的数据。在Redis中设置添加,删除和测试成员的存在(恒定时间O(1),而不考虑集合中包含的元素数量)。列表的最大长度为2^32 - 1个元素(即4294967295,每组集合超过40亿个元素)。
  5. 可排序集合
    Redis可排序集合类似于Redis集合,是不重复的字符集合。 不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。虽然成员是唯一的,但分数值可以重复。

四、linux(ubantu)下的操作指令

#安装redis,类似centos下的yum指令
sudo apt-get update
sudo apt-get install redis-server

#启动redis
redis-server

#运行redis,进入redis命令行
redis-cli
#接受到PONG回应,这表明Redis已成功在您的计算机上安装了。
ping

#远程运行redis
redis-cli -h host -p port -a password

#设置密码
#查看是否设置了密码,默认情况下属性值 requirepass 为空
CONFIG get requirepass
#设置密码,设置之后再进行任何操作之前就需要验证了
CONFIG set requirepass "123"
#验证密码
AUTH 123

#计数器
INCRBY member 1
get member

五、windows下安装使用

redis已经不针对Windows出版本了,官网甚至去掉了Windows下载选项,所以只能从github上下载。

#启动,出现图形版本好信息,但会阻塞该命令行,一旦关闭,进程会被kill掉
redis-server redis.windows.conf
#设置redis为服务
redis-server --service-install redis.windows-service.conf --loglevel verbose
#常用指令,卸载,开启,停止
redis-server --service-uninstall
redis-server --service-start
redis-server --service-stop

redis快速入门
Redis在Windows下的安装过程
Redis的7个应用场景
redis官网下载(linux版本)
redis github下载(Windows版本)