一:拓展安装
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。