redis的使用
2018-01-12 本文已影响0人
塞外务农
[TOC]
一、redis安装
windows:
1)进入redis目录
2)安装:redis-server --service-install redis.windows.conf
3)重启:redis-server --service-start
redis-server --service-stop
redis-server --service-uninstall
创建多个实例:
redis-server --service-install –service-name redisService1 –port 10001
redis-server --service-start –service-name redisService1
redis-server --service-install –service-name redisService2 –port 10002
redis-server --service-start –service-name redisService2
redis-server --service-install –service-name redisService3 –port 10003
redis-server --service-start –service-name redisService3
http://keenwon.com/1275.html
https://github.com/ServiceStack/redis-windows
安全一:redis设置访问密码 redis.windows.conf -> requirepass 123456
安全二:切勿使用默认6379,容易遭到攻击 redis.windows.conf -> port 6666
安全三:绑定本地ip和允许连接的客户端ip redis.windows.conf -> bind 192.168.0.106 127.0.0.1
出现问题:redis server went away 说明redis服务器没有开启
linux:
二、redis介绍
Redis开源软件,是在linux下开发的,用c语言。
使用gcc编译安装。
Redis是Remote Dictionary Server(远程数据服务)的缩写
由意大利人 antirez(Salvatore Sanfilippo) 开发的一款 内存高速缓存数据库
该软件使用C语言编写,它的数据模型为 key-value
它支持丰富的数据结构,比如string(字符串)、list(列表)、set(集合)、sorted set(有序集合) 、hash(哈希散列表)
可持久化,保证了数据安全。
默认端口6379
相比较mysql,mysql是存在在硬盘上的。
三、redis基本语法
1、查看版本号:
info
从0 - 15共16个数据库
2、key操作
exists key 测试指定key是否存在
del key1 key2 ... 删除指定key
type key 返回指定key的value类型
keys pattern 返回匹配指定模式的所有key (keys * 获取所有的key | keys n* 获取所有n开头的数据)
rename oldkey newkey 改名字
dbsize 返回当前数据库的key数量
expire key seconds 给key指定过期时间
ttl key 返回key的剩余过期秒数
select db-index 选择数据库
move key db-index 将key从当前数据库迁移到指定数据库
flushdb 删除当前数据库中所有key
flushall 删除所有数据库中所有key
3、string操作
string是redis最基本的类型,redis的string可以包含任何数据,包括jpg图片或者序列化的对象,单个value值最大上限是1G字节
set key value 设置key对应的值为string类型的value
mset key1 value1 key2 value2 ... 一次设置多个key的值
mget key1 key2 ... 一次获取多个key的值
incr key 对key的值做加加操作,并且返回新的值 (注意:对没有设置的key进行incr、decr操作,就会创建这个key,并且+1或者-1)
decr key 对key的值做减减操作,并且返回新的值
incrky key integer 对key的值做加加操作,但是指定值,并且返回新的值
decrby key integer 对key的值做减减操作,但是指定值,并且返回新的值
append key value 给指定key的字符串值追加value
substr key start end 返回截取过的key的字符串值
4、list操作
list类型是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列
上进上出:栈 (从上面放数据,再从上面拿数据,旧的数据沉在底下,新的数据浮在上面,那么最终拿出来的都是新数据,先进后出)
上进下出:队列 (从上面放数据,再从下面拿数据,每次新的数据进去了,旧的数据出来了,那么最终拿出来的都是旧数据,先进先出)
eg:
获取最新的2个登录用户,使用队列方法如下:
第一次插入 lpush userid => 11 list结果为:[11]
第二次插入 lpush userid => 22 list结果为:[22, 11]
第三次插入 lpush userid => 33 list结果为:[33, 22, 11]
ltrim user 0 1
lrange user 0 1
lpush key string 在key对应list列表的头部添加字符串元素
rpush key string 在key对应list列表的尾部添加字符串元素
lpop key 从list列表的头部弹出(或者删除)元素,并返回该元素
rpop key 从list列表的尾部弹出(或者删除)元素,并返回该元素
llen key 对应list的长度,key不存在返回0,如果key对应类型不是list返回错误
lrange key start end 返回指定区间的元素,下表从0开始
ltrim key start end 截取list,保留截取区间内元素
5、set操作
set是string类型的无序集合,最大可包含2^32-1个元素
set集合类型具有:添加、删除、取并集、交集、差集(通过这些操作可以很容易的实现sns中的好友推荐功能操作)
sadd key value 添加一个string元素到key对应的set集合中,成功返回1,如果元素已在集合中则返回0,key对应的set不存在返回错误
sren key value1 value2 ... 从key对应set中移除给定元素,成功返回1
smove p1 p2 value 从p1对应set中移除member并添加到p2对应set中
scard key 返回set的元素个数
sismember key value 判断member是否在set中
sinter key1 key2 ... 返回所有指定key的交集
sunion key1 key2 ... 返回所有指定key的并集
sdiff key1 key2 ... 返回所有指定key的差集(前者对后者的差集,结果只有前者的数据没有后者,反之亦然)
smembers key 返回key对应set的所有元素,结果是无序的
6、sort set操作
sort set是string类型的有序集合,是(list、set)两种类型的集中体现
每个元素都会关联一个权,通过权/值可以有序的获取集合中的元素
eg:
回复量最高的前3个帖子
帖子回复量(score|权) 帖子id(value|值)
100 1
200 2
300 3
... ...
zadd tieba 300 3
zadd tieba 400 4
zadd tieba 500 5
zadd tieba 200 2
zremrangebyrank tieba 0 0 进来一个就删除一个权值最低的,保证里面一共有三个(或者直接zrevrange tieba 0 2)
zadd keyname score value 添加元素到集合,元素在集合中存在则更新对应score
zrem keyname value 删除指定元素,1表示成功,如果元素不存在返回0
zincrby keyname incr value 按照incr幅度增加对应value的score值,返回score的值 (zincrby tieba 100000 1)
zrank keyname value 返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
zrevrank keyname value 返回指定元素在集合中的排名(下标),集合中元素是按score从大到小排序的
zrange keyname start end 从集合中取指定区间的元素,返回的结果是按score正序的
zrevrange keyname start end 从集合中取指定区间的元素,返回的结果是按score逆序的
zcard keyname 返回集合中元素个数
zscore keyname value 返回指定元素对应的score
zremrangebyrank keyname min max 删除集合中排名在指定区间的元素(权值从小到大排序)
7、hash操作
存储类似于mysql里的一条完整的记录,或者一个对象类的存储
hset keyname k v 设置k为指定值,如果key不存在,则先创建
hget keyname k 获取指定的k
hmget keyname k1 k2 ... 获取全部指定的k
hmset keyname k1 v1 k2 v2 ... 同时设置多个值
hincrby keyname k v 将指定的k加上给定值v
hexists keyname k 测试指定的k是否存在
hdel keyname k 删除指定k
hlen keyname 返回指定的key数量
hkeys keyname 返回所有的k
hvals keyname 返回所有的v
hgetall keyname 返回所有的k和v
四、持久化功能
redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘一份,在服务器重启之后会自动把硬盘的数据恢复到内存中去,数据保存到硬盘的过程就是持久化
方法一: snap shotting(快照持久化) 主要做大的持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘里,如果数据非常多(10-20G)就不适合频繁进行该持久化操作
快照持久化备份文件:dump.rdb
该方式备份机制(频率):redis.conf
save 900 1 900秒内超过1个key被修改,发起快照保存
save 300 10 300秒内超过10个key被修改,发起快照保存
save 60 10000 60秒内超过10000个key被修改,发起快照保存
三个备份频率需要同时存在,数据变化快的时候需要快速备份(保证数据安全),数据变化慢的时候需要缓慢备份(节省服务器资源)
方法二: append only(AOF持久化) 主要做精细持久化,和快照持久化组成合作关系,当redis启动后将收集dump.rdb、appendonly.aof两者的数据一起还原到内存中
AOF持久化本质:把用户执行的每个写指定(添加、修改、删除)都备份到文件中,还原数据到内存中的时候就是执行具体写指令而已(比如把里面的记录的num = 1 都加起来)
开启AOF持久化备份:redis.conf
打开 -> appendonly yes
重启 -> redis-server
生成 -> appendonly.aof
备注 -> AOF持久化开始后将自动清除redis所有数据
开启之后需要restart redis,才能生效
redis持久化指令:
./redis-cli bgsave - 同步保存数据到磁盘(快照保存)
./redis-cli bgrewriteaof - 当日志文件过长是优化AOF日志文件存储
./redis-cli -h 127.0.0.1 -p 6379 bgsave - 手动发起快照
kill -9 7634 杀死7634这个进程
五、redis主从模式
1) mysql为了降低每个服务器负载,可以设置读写分离(读服务器、写服务器)
2) 为了降低每个redis的负载,可以多设置几个,并做主从模式,一个服务器负载 "写"(添加、修改、删除)数据,其他服务器负载 "读" 数据,主服务器数据会 "自动" 同步给从服务器
配置文件redis.conf:
设置并成为192.168.40.148服务器的从服务器 [ slaveof masterip masterport | slaveof 192.168.40.148 6379 ],然后主服务器将自动同步数据到从服务器,无需过问
redis.conf: slave-read-only yes 默认只读
六、安装php的redis扩展
windows:
1)将 php_redis.dll 扩展放入 /php/ext/ 文件中
2)php.ini extension=php_redis.dll
linux:
七、php操作redis
在php中,redis就是一个功能类Redis,Redis类中有很多成员方法(名字基本和redis指令名字一样,参数也一样)
1) 实例化redis对象 $redis = new Redis();
2)连接redis服务 $redis->connect('127.0.0.1', '6379');
3)连接密码 $redis->auth('123456');
4)设置值 $redis->set('name', 'xiaoming');
5)取值 echo $redis->get('name');
更多成员方法:
$redis->mset(array('one'=>11, 'two'=>22));
$redis->get('one');
php中redis的可操作方法:
利用反射 Reflection 实现获取 Redis类内部的方法
php大部操作都是正向的,类、实例化对象、对象调用成员
其实类可以反向操作,类、返货来感知类的成员、反方向感知方法是否是公开的/私有的/受保护的/最终的
通过Redis类实例化一个反射类对象
$redis = new ReflectionClass('Redis');
通过对象获得Redis类的全部方法
$redis->getMethods();