memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决:
1、数据持久性问题,memcache用内存进行存储,一旦memcache服务器宕机,那么所存储的数据全部丢失。
2、memcache存储的数据类型单一,只支持key-value型的数据,要存储复杂类型的数据,必然需要PHP脚本的大量逻辑操作。
redis基本介绍
redis也是一个内存非关系型数据库,它拥有memcache在数据存储上的全部优点,而且在memcache的基础上(memcache的介绍可以看前面一篇:https://www.jb51.net/article/121315.htm
增加了数据持久性功能,redis用rdb和aof两种方式实现数据持久性,在服务器突然宕机时也能几乎保留已存的全部数据。
增加了string(字符串)、set(集合)、sorted_set(有序集合)、hash(哈希)、list(链表)数据类型,方便了多类型的存储和数据库操作。
增加了安全验证(可为服务器设置连接密码)。
redis的主从分离等系统更完善(官方开发)。
原生支持发布/订阅、队列、缓存等工具。
当然,相比较memcache,它的数据库操作也较为复杂。
redis的应用场景和安装
redis除了可以用在memcache能用的地方,它还可以用在:
可以用链表来存储数据,读取其最新信息。
可以用有序列表存储数据,读取其排行榜数据
可以用集合来存储关注/被关注信息。
在官网()下载到它的最新版本,直接解压,因为redis官方已经编译过了,直接进行make / make test ,在make install时可以指定其安装路径。
安装完成后,将安装包里的redis的conf文件mv到安装目录的bin目录下,它是配置和启动redis所必需的。
除此,安装目录文件下bin目录里还有如下文件。
redis-benchmark //性能测试工具 -n xxx 表示发出xxx条命令用来测试
redis-check-aof //检查aof日志的工具
redis-check-dump //检查rbd日志的工具
redis-cli //客户端
redis-server //redis的服务器进程
redis-sentinel //redis哨兵模式的进程
我们用vim打开redis.conf来简单配置redis服务器。
将daemonize 选项改为yes来后台运行
database n 设置一个redis服务器里有n个服务器,默认为0-15共16个
port n 来设置redis服务器的监听端口
设置requirepass yourpassword来设置密码,客户端连接后用auth password来通过验证
我们使用./redis-server ./redis.conf命令来打开redis服务器。
使用./redis-cli [-p port]来连接服务器(默认6379)。
redis的命令
基本(包括string字符串类型)命令
set key value [ex|px n] //设置值[并设置过期时间为n秒/毫秒] get key //获取值 del key //删除值 incby|decby key n //将key值自增或自减n rename key newkey//覆盖原来的 select n//选择第n个数据库 ttl key //查询key的过期时间,-1表示永不过期,不存在的为-2 expire key n //设置key的过期时间为n秒 type key //获取key的存储类型 flushdb //清除当前数据库中的值 shutdown [nosave]//关闭服务器[不存储]
list(链表)命令
lpush/rpush list value1 [value2 value3...] //将value压入链表头/尾 lpop/rpop list //弹出链表头/尾的值 llen list //获取链表长度
set(集合)命令
sadd set value //往集合中添加value smembers set //查看集合中的全部数据 srem set value1[value2...]//删除集合中的元素 sismember set value //判断value是否是集合中的一个元素
sorted_set(有序集合)命令
zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,并定义其score,集合会用score对其排序
zrange sorted_set a b [withscores]从第a到第b显示有序列表中的值 b为-1时显示全部,[显示各个值的score]
zrank/zrevrank sorted_set key 正序/倒序显示key在有序集合中的位置
zrem sorted_set key 删除有序集合中的key
zcard sorted_set [m n]计算有序集合中[score在m到n之间的]一共有多少个
hash(哈希类型)命令
hset hashset key value 设置hash表key的值为value
hget hashset key 获取hash表的key值
hdel hashset key 删除hash表中的一个key
hlen hashset 获取hash表的长度
redis命令繁多,这里只列了一点简单的,具体命令可以其官网或其中文站查看翻译文档
redis的事务和发布、订阅
redis中的事务与mysql的类似,只有语句有些不同。
redis mysql 开始事务 multi start transition 事务中的query语句 执行事务 exec commit 回滚事务 discard roll back
对于并发影响,redis有watch语句控制,被watch语句监测的key值一旦在事务提交前发生变化,则事务自动被取消回滚。
watch key1 [key2...]
unwatch 取消所有监测。