动态

详情 返回 返回

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
user avatar rui_sen 头像 chat2db 头像 lanyiyun666 头像
点赞 3 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.