redis 缓存隔离 中的增删改查(laravel )

2017-02-28 03:33:13   Laravel

  laravel   redis缓存  

redis 缓存隔离 中的增删改查(laravel )

当网站项目中 为了提升访问速度,使用redis缓存是常用的做法,原里在这里简单解释一下mysql和redis,mysql数据是存在磁盘中的,而redis是存在内存中的,学过电脑的都知道,内存的访问速度要比磁盘快的多,所以,在项目项目中,把访问量较高的数据,放在resdis服务器中,是提升性能,流畅度的有效手段。


在使用 Redis 之前,你必须通过 Composer 安装 predis/predis 扩展包(~1.0)。

安装predis组件

  1. composer require "predis/predis:~1.0"

配置 应用程序的 Redis 设置都在 config/database.php 配置文件中。在这个文件里,你可以看到 redis 数组里面包含了应用程序使用的 Redis 服务器:

  1. 'redis' => [
  2. 'cluster' => false,
  3. 'default' => [
  4. 'host' => '127.0.0.1',
  5. 'port' => 6379,
  6. 'database' => 0,
  7. ],
  8. ],

然后就可以使用了

下面讲一下 常用的 redis 中语句

  • LIST类型 列表 存 用来存索引字段

    1. //存
    2. Redis::rpush($key,$data);
    3. //取
    4. Redis::lrange($listkey,0,-1);// 0,-1代表取所有
  • 哈希 用来存放 与索引对应的 value值

    1. //存
    2. Redis::hMset($hashkey,$data);
    3. //取
    4. Redis::hGetall($hashkey);
  • 删除

    1. Redis::lrem($key,0,$where['guid']);
  • 修改

    1. Redis::hMset($key,$data);

核心思想

这里说一下rediskey 规范 第一个字段数据类型 第二 三个字段 业务类型 2.3业务类型 4就是索引或者空了 (HASH:GOODS:INFO:商品GUID)
LISTkey -> hashkey ->value

当用户访问内容的时候,先判断有无LISTkey 有的话 直接从 redis服务器里取出所有LISTkey 然后 根据 LISTkey 循环取 对应hashakey里的value,返回ok ,如果redis服务器里没有,从mysql里面读取,然后再往redis 里写,这样就保持了数据的统一,因为服务器重启的话,redis里的数据会清空,
这一块逻辑要处理好,到这可能有人会问,我怎样区分我是访问的mysql还是redis,在这我推荐 调试利器, Debugbar,帮你快速分析,嫌麻烦的,利用打日志也
可以区分,下面是 实际例子

用户列表

guid username password
0dbbecb8fc2511e69b4f080027bac1bb a 123
18466f0afc2511e6b0cf080027bac1bb e 123
18fca040fc2511e6a1f0080027bac1bb h 123

listkey 表(其实不存在表,这里是我模拟一下写它redis里的状态,便于理解)

key->guid(唯一识别id)

LISTkey guid
LIST:TEST:USER 0dbbecb8fc2511e69b4f080027bac1bb
LIST:TEST:USER 18466f0afc2511e6b0cf080027bac1bb
LIST:TEST:USER 18fca040fc2511e6a1f0080027bac1bb

hashKey 表 (用意同上)

hashKey value
HASH:TEST:USER:0dbbecb8fc2511e69b4f080027bac1bb data1(数组)
HASH:TEST:USER:18466f0afc2511e6b0cf080027bac1bb data2(数组)
HASH:TEST:USER:18fca040fc2511e6a1f0080027bac1bb data3(数组)
  1. class UserRegister
  2. {
  3. protected static $table = 'user';
  4. protected static $listkey = LIST_TEST_USER_;//这里做了宏定义要注意呦
  5. protected static $hashkey = HASH_TEST_USER_;//
  6. //注册
  7. public function addDate($data){
  8. if (empty($data))return false;
  9. $type = DB::table(self::$table)
  10. ->insert($data);
  11. if($type){
  12. //注册信息 写入redis
  13. //写入索引
  14. \Redis::rpush(self::$listkey,$data['guid']);
  15. //写入哈希
  16. \Redis::hMset(self::$hashkey.$data['guid'],$data);
  17. }else{
  18. return false;
  19. }
  20. return $type;
  21. }
  22. //取数据
  23. public function getorder($where)
  24. {
  25. if (empty($where))return false;
  26. //查看key是否存在 redis查询时候 存在返回 1 不存在返回0
  27. // empty()不存在 返回true 存在返回 false
  28. if(empty(\Redis::exists(self::$listkey))){
  29. //如果不存在的话 从数据库读
  30. $obj = DB::table(self::$table)
  31. ->where($where)
  32. ->get();
  33. $array = self::objectToArray($obj);
  34. //再次写入redis
  35. foreach ($array as $data){
  36. \Redis::rpush(self::$listkey,$data['guid']);
  37. \Redis::hMset(self::$hashkey.$data['guid'],$data);
  38. }
  39. return $array;
  40. }
  41. //如果redis存在
  42. //读取所有索引 字段
  43. $list = \Redis::lrange(self::$listkey,0,-1);
  44. $array = null;
  45. //便利索引 查询hash数据
  46. foreach($list as $v){
  47. $array[] = \Redis::hGetall(self::$hashkey.$v);
  48. }
  49. return $array;
  50. }
  51. //修改更新数据&删除数据
  52. public function updateUserPass($where,$data,$type)
  53. {
  54. if (empty($where)&&empty($data)&&empty($type)) return false;
  55. $status = DB::table(self::$table)
  56. ->where($where)
  57. ->update($data);
  58. $key = self::$listkey;
  59. if ($type['state']=='update'){
  60. $type = Redis::hMset($key,$data);
  61. if($type){
  62. \Log::error('redis_id:'.$key.'.修改成功');
  63. return true;
  64. }else{
  65. \Log::error('redis_id:'.$key.'.修改失败');
  66. }
  67. }else if ($type['state']=='delete'){
  68. // $type = Redis::del($key);//只是删除keys
  69. $type = Redis::lrem($key,0,$where['guid']);//删除数据
  70. if($type){
  71. \Log::error('redis_id:'.$key.'.删除成功');
  72. return true;
  73. }else{
  74. \Log::error('redis_id:'.$key.'.删除失败');
  75. }
  76. }
  77. return $status;
  78. }
  79. //这里要提的是 db取出来的是对象 必须转为数组才能存
  80. //对象转数组
  81. public static function objectToArray($e)
  82. {
  83. $e = (array)$e;
  84. foreach ($e as $k => $v) {
  85. if (gettype($v) == 'resource') return;
  86. if (gettype($v) == 'object' || gettype($v) == 'array')
  87. $e[$k] = (array)self::objectToArray($v);
  88. }
  89. return $e;
  90. }
  91. //数组转对象
  92. public static function arrayToObject($e)
  93. {
  94. if (gettype($e) != 'array') return;
  95. foreach ($e as $k => $v) {
  96. if (gettype($v) == 'array' || getType($v) == 'object')
  97. $e[$k] = (object)self::arrayToObject($v);
  98. }
  99. return (object)$e;
  100. }
  101. }
  • DB取出来的是对象
  • redis hash里的只能存数组不能是对象,所以取出来的也是数组
    可以使用 上面封装的两个类型转换的方法进行装换,也可使用php自带的函数
  1. $array = collect($obj)->toArray();//系统对象转数组方法
  2. $obj = collect($array)->toJson();//系统数组转对象方法

其他组合关系型方法

至于其他的关系型的组合方法就在下面简要做做介绍了,纯手码写得也挺累,望大家体谅。。

  • 队列和字符串类型
    队列和字符串类型一样可以把数据关系型
    1. 思路:同样的list存索引的key(ID或唯一识别ID),字符串存json字符串,字符串的key同样后缀加唯一识别ID来进行区分。当需要输出到页面上的时候json_decode过来就行了
    2. 队列和字符串的优点是存储的空间小,劣势在于存的时候要解析成字符串,取的时候要解析为数组或对象
  • 集合和字符串类型
    集合和字符串类型一样可以把数据关系型

    1. 思路:大家应该都知道 redis集合有有序集合和无序集合之分,在有些场景中,其实用集合的形势反而更灵活(多维度集合控制),比如 关注我的人、我关注的人、同时互相关注的、QQ中的'可能认识的人'、异步写入时分区间等等等...
    2. 集合和哈希类型

    思路其实就是和上面差不多,也就是存储方便,消耗内存相比较而言较大。

    参考文章:来自大丢哥 https://www.blog8090.com/

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

感谢你的支持,我会继续努力!
扫码打赏,建议金额1-10元