Yii实现redis操作

一:拓展安装

composer require yiisoft/yii2-redis

二:基本配置

1:redis组件配置

在配置文件中增加如下配置

'components' => [
    ...
    'redis' => [
        'class' => 'yii\redis\Connection',
        'hostname' => 'localhost',//redis地址
        'port' => 6379,//端口
        'username' => 'XXX',//账号,需要时配置
        'password' => 'XXX',//密码,需要时配置
        'database' => 0,
    ],
    ...
]  

2:缓存组件配置

在使用缓存时我们也可以使用redis来进行缓存,配置如下

'components' => [
    ...
    'cache' => [
        'class' => 'yii\redis\Cache',
        'redis' => [
            'hostname' => 'localhost',//redis地址
            'port' => 6379,//端口
            'username' => 'XXX',//账号,需要时配置
            'password' => 'XXX',//密码,需要时配置
            'database' => 0,
        ],
    ],
    ...
]  

三:基本使用

1:redis基本操作

//设置键值
Yii::$app->redis->set('key','value');
//获取指定键对应的值
Yii::$app->redis->get('key');
//删除指定键
Yii::$app->redis->del('key');
//获取所有键
Yii::$app->redis->keys("*");

2:redis列表操作

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

//将一个或多个值插入到列表头部
Yii::$app->redis->lpush('key1', 'value1', 'value2');
//获取列表指定范围内的元素
Yii::$app->redis->lrange("key1",0,1);
//通过索引设置列表元素的值
Yii::$app->redis->lset('key1',1,'value3');

3:redis哈希操作

Redis hash 是一个string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

//设置哈希存储
Yii::$app->redis->hmset('index','key1','value1','key2','value2');
//获取在哈希表中指定 key 的所有字段和值
Yii::$app->redis->hgetall('index');
//获取所有给定字段的值
Yii::$app->redis->hmget('index', 'key1', 'key2');
//获取存储在哈希表中指定字段的值
Yii::$app->redis->hget('index', 'key1');

4:redis无序集合操作

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合对象的编码可以是 intset 或者 hashtable。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

//向集合添加一个或多个成员
Yii::$app->redis->sadd('key','value1','value2','value3','value4');
//获取集合的成员数
Yii::$app->redis->scard('key');
//返回集合中的所有成员
Yii::$app->redis->smembers('key');

5:redis有序集合操作

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

//向有序集合添加一个或多个成员,或者更新已存在成员的分数
Yii::$app->redis->zadd('index','score1','member1','score2','member2');
//获取有序集合的成员数
Yii::$app->redis->zcard('index');
//通过索引区间返回有序集合指定区间内的成员
Yii::$app->redis->zrange('index',0,2);

三:redis原子性操作

在redis中我们使用redis脚本来实现原型性操作,Redis脚本时使用Lua解释器来执行脚本实现原子性操作,reids原子性操作表示将多个redis一系列的操作融合成一步,一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,redis原子性操作常用于高并发下数据处理

1:语法说明

EVAL script numkeys key [key ...] arg [arg ...]

参数说明

  • script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
  • numkeys: 用于指定键名参数的个数。
  • key [key ...]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
  • arg [arg ...]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。

2:简单操作

$script = <<<LUA
        return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}
LUA;
$eval = Yii::$app->redis->eval($script, 2, 'key1', 'key2', 'argv1', 'argv2');
print_r($eval);//Array ( [0] => key1 [1] => key2 [2] => argv1 [3] => argv2 )

3:简单实现并发操作

#简单实现
//设置商品数量
$key = 'num';
Yii::$app->redis->set('num', 100);

$script = <<<LUA
    if(tonumber(redis.call('GET',KEYS[1]))>0) then
        redis.call('decr',KEYS[1])  #商品数量减一
        return true
    else
        return false;
    end
LUA;
$eval = Yii::$app->redis->eval($script, 1, $key);
$num = Yii::$app->redis->get('num');
print_r($num);//99


#哈希实现
Yii::$app->redis->hmset('goods','num', 100);

$script = <<<LUA
    local num = redis.call('HGET',KEYS[1], KEYS[2]);
    if(tonumber(num)>0) then
        redis.call('HINCRBY',KEYS[1], KEYS[2], -1)
        return true
    else
        return false;
    end
LUA;

Yii::$app->redis->eval($script, 2, 'goods', 'num');
print_r(Yii::$app->redis->hget('goods', 'num'));//99
相关推荐
zpjing~.~27 分钟前
Mongo 分页判断是否有下一页
数据库
2401_8576009528 分钟前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
秋恬意1 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
潇湘秦1 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石1 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器1 小时前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb
从以前1 小时前
Berlandesk 注册系统算法实现与解析
数据库·oracle
Muko_0x7d21 小时前
Mongodb
数据库·mongodb
Ren_xixi1 小时前
redis和mysql的区别
数据库·redis·mysql
m0_748233882 小时前
SQL语句整理五-StarRocks
数据库·sql