PHP中使用Redis

PHP 中使用 Redis

基本使用

// 1. redis 数据库连接对象
$redis = new Redis();
$redis -> connect('localhost', 6379);

// 2. redis 密码验证(默认没有开启,如果开启需要使用 auth函数)
// $redis -> auth('redis');

// 3. redis 选择数据库(默认redis服务有16个数据库) 0-15
$redis ->select(0);

// 4. 设置值
$data = $redis->set('name', 'jack');

// 5. 获取值
echo($redis->get('name'));

常用方法

  • keys 获取当前数据库中所有的键, 返回一个数组
$redis -> set('name', 'jack');
$redis -> set('age', '19');
$redis -> set('height', '172');

// 返回一个数据
$keysArray = $redis->keys('*');

echo'<pre>';
print_r($keysArray);
echo '</pre>';
  • exists 检测一个键名是否存在 返回一个布尔值
$redis -> set('name', 'jack');
$redis -> set('age', '19');
$redis -> set('height', '172');

$bool = $redis->exists("name");
var_dump($bool);
  • del 删除一个键
$redis -> set('name', 'jack');
$redis -> set('age', '19');
$redis -> set('height', '172');


$bool = $redis->del('name'); // 1

$bool = $redis->get('name');
var_dump($bool); // false
  • flushdb 清空当前数据库 flushall 清空所有数据库
$redis -> set('name', 'jack');
$redis -> set('age', '19');
$redis -> set('height', '172');

$bool = $redis -> flushdb();
var_dump($bool);

var_dump($redis->get('name'));   // false
var_dump($redis->get('age'));    // false
var_dump($redis->get('height')); // false

redis 可以存储的数据类型

  • string 保存一般字符串
  • Hash 保存多属性的值
  • List 队列
  • Set
  • Zset

字符串

字符串 (写入)

  • set() 写入一个值
//写入一个数据
$data = $redis->set('key1', 'test');
  • setex() 设置一个值并设置时效
// 写入一个数据并设置时效, 5秒后过期
$data = $redis->setex('key2', 5, 'test');
$data = $redis->get('key2');
  • mset() 批量写入数据
// 批量写入数据, 传入一个关联数组
$data = $redis->mset(['name'=>'alex', 'age'=>18, 'height'=>172]);
  • expire() 设置某个键的生命周期
$redis->set('name', 'jack');

// 设置一个键的生命周期
$data = $redis->expire('name', 10);
  • setnx() 检查一个键是否存在, 如果存在就不设置(返回false) 不存在就设置(返回true)
// 刷新两次就能看到结果
$bool = $redis->setnx('name', 'jason');
var_dump($bool);

字符串 (获取)

  • get() 获取一个值
$redis -> set('name', 'tom');
$redis -> set('age', 18);
$redis -> set('height', 172);

echo $redis -> get('name');
  • mget() 获取多个值获取失败返回false, 成功返回键对应的值
$redis -> set('name', 'tom');
$redis -> set('age', 18);
$redis -> set('height', 172);

$arr = $redis -> mget(['name', 'age', 'height']);

// 获取多个值
echo'<pre>';
print_r($arr);
echo '</pre>';

字符串 (删除)

  • delete() 删除指定的键,返回受影响的行数
$redis -> set('name', 'tom');
$affect = $redis -> delete('name');
echo $affect;

$redis -> set('name', 'tom');
$redis -> set('age', 18);
$redis -> set('height', 172);

$affect = $redis -> delete(['name', 'age', 'height']);
echo $affect; // 3

字符串(其他函数)

  • incr() 递增
$count = $redis->incr('count');
echo $count;
  • decr() 递减
$count = $redis->decr('count');
echo $count;
  • incrby 递增并且指定步长
$count = $redis->incrby('count', 5); // 每次递增 5
echo $count;
  • decrby递减并且指定步长
$count = $redis->decrby('count', 5); // 每次递减 5
echo $count;

Hash (设置哈希)

  • hset()设置hash属性
// 设置hash: hset('key', 'attribute', 'value');
$data = $redis->hset('user', 'name', 'alex');
$data = $redis->hset('user', 'age', '18');
  • hget() 读取某个 hash属性
// 获取hash: hget('key', 'attribute');
var_dump($redis->hget('user', 'name'));

Hash

Hash (删除哈希)

  • hdel() 删除 hash 的某个 属性
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);


var_dump($redis->hdel('user', 'name'));

var_dump($redis->hget('user', 'name'));
  • delete 删除指定键名的 hash
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

var_dump($redis->del('user'));
var_dump($redis->hget('user', 'name'));   // false
var_dump($redis->hget('user', 'age'));    // false
var_dump($redis->hget('user', 'height')); // false

Hash (修改哈希)

  • hset() 修改hash的属性
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

var_dump($redis->hset('user', 'age', 20));

var_dump($redis->hget('user', 'age'));

Hash (其他)

  • hincrby()hash 的某个属性递增
$redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
// hincrby('key', 'attr', step);
$redis->hincrby('user', 'age', 1);
var_dump($redis->hget('user', 'age'));
  • hincrby()hash 的某个属性递减
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
$redis->hincrby('user', 'age', -1);
var_dump($redis->hget('user', 'age'));

Hash(获取)

  • hget() 获取某个属性的值
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

// 获取单个属性
var_dump($redis->hget('user', 'age'));
  • hmget() 获取多个属性的值
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

// 获取多个属性
var_dump($redis->hmget('user', ['age','age','height']));
  • hgetall() 获取所有属性的值 ps: 这个函数在循环中有 bug
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

// 获取所有属性
$arr = $redis->hgetall('user');
echo '<pre>';
print_r($arr);
echo '</pre>';
  • hashlen() 获取hash 的个数
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

// 获取所有属性的个数
echo $redis->hlen('user'); // 3
  • hkeys() 获取所有的键名
// 一次设置多个hash属性值: hmset('key', [ attr1=>value1, attr2=>value2 ])
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

// 获取所有属性的个数
$keys = hkeys('user');
echo'<pre>';
print_r($keys);
echo '</pre>';
  • hvals() 获取所有的键值
// 一次设置多个hash属性值: hmset('key', [ attr1=>value1, attr2=>value2 ])
$bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);

// 获取所有属性的个数
$vals = hvals('user');
echo'<pre>';
print_r($vals);
echo '</pre>';

List

增加

  • 左侧压值
// 队列, 左侧压入值, 右侧压入值
$redis->lpush('queue', 'jack');
$redis->lpush('queue', 'jason');
  • 右侧压值
$redis->rpush('queue', 'tom');
$redis->rpush('queue', 'ken');

删除

  • 左侧弹出值
// 左侧弹出一个值,并返回
echo $redis->lpop('queue'); // jason
  • 右侧弹出值
// 左侧弹出一个值,并返回
echo $redis->rpop('queue');  // tom
  • 删除指定的值
// 队列, 左侧压入值, 右侧压入值
$redis->lpush('queue', 'jack');
$redis->rpush('queue', 'tom');
$redis->lpush('queue', 'jason');

// 删除指定的值,并返回索引
echo $redis->lrem('queue', 'jason');

修改

  • 修改指定的值
// 队列, 左侧压入值, 右侧压入值
$redis->lpush('queue', 'jack');
$redis->rpush('queue', 'tom');
$redis->lpush('queue', 'jason');

// 删除指定的值,并返回索引
echo $redis->lset('queue', 'tom', 'tomson');
  • 设置第 n 个值 (索引从0 开始)
  • 右侧弹出左侧压入
$redis->lpush('list', 'java');
$redis->lpush('list', 'php');
$redis->lpush('list', 'c');
$redis->rpush('list', 'c++');
$redis->rpush('list', 'python');
$redis->rpush('list', 'javascript');

// 弹出list列表中的最右边的一个值放到list-2列表中,返回弹出的那个值
$data = $redis->rpoplpush('list', 'list-2'); // js

var_dump($data);

获取

  • 返回第 n 个元素的值 (索引从0 开始)

$redis->lpush('list', 'java');
$redis->lpush('list', 'php');
$redis->lpush('list', 'c');
$redis->rpush('list', 'c++');
$redis->rpush('list', 'python');
$redis->rpush('list', 'javascript');

// 获取指定索引的值
$data = $redis->lindex('list', 2); // java
  • 返回列表中的一段数据
$redis->lpush('list', 'java');
$redis->lpush('list', 'php');
$redis->lpush('list', 'c');
$redis->rpush('list', 'c++');
$redis->rpush('list', 'python');
$redis->rpush('list', 'javascript');

// 获取一段值
$data = $redis->lrange('list', 0, -1); // 从0开始获取所有数据
$data = $redis->lrange('list', 0, -2); // 从0开始获取到倒数第二个的位置
$data = $redis->lrange('list', 0, 2);  // 从0开始获取到第二个元素的位置

var_dump($data);
  • 获取列表的长度
$redis->lpush('list', 'java');
$redis->lpush('list', 'php');
$redis->lpush('list', 'c');
$redis->rpush('list', 'c++');
$redis->rpush('list', 'python');
$redis->rpush('list', 'javascript');

// 获取集合的元素个数
$length = $redis->lsize('list');
var_dump($length);

set 集合(集合中没有重复的数据, 自动去重)

set集合默认是无序的

增加

  • sadd()
// set 集合添加值: sadd('key', 'value1', 'value2', ... 'valuen');
// 在添加值的时候, 如果值已经存在就会添加失败
$redis -> sadd('users','tom', 'jack', 'alex', 'jason');

删除

  • 删除
// set集合删除值: srem('key', '需要删除的值');
$data = $redis->srem('users', 'tom');

获取

  • smembers() 获取集合中所有的元素,返回一个数组
$redis->sadd('animal', 'dog', 'cat');
$redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中

// smove(原集合,目标集合,需要移动的值)该方法返回一个布尔值
$data = $redis->smembers('fruit');

var_dump($data);
  • srandmember() 随机取出一个元素
$redis->sadd('fruit', 'apple', 'lemon', 'banana');
$data = $redis->srandmember('fruit');

var_dump($data);
  • sinter() 交集, 取出两个集合中相同的元素, 返回一个数组
$redis->sadd('animal', 'dog', 'cat', 'bird');
$redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中

// 交集
$data = $redis->sinter('animal', 'fruit'); // bird
var_dump($data);
  • sunion() 并集, 合并两个集合并去重, 返回一个数组
$redis->sadd('animal', 'dog', 'cat', 'bird');
$redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中

// 并集
$data = $redis->sunion('animal', 'fruit');
  • sdiff() 差集, 比较两个集合中的元素,返回一个数组
$redis->sadd('animal', 'dog', 'cat', 'bird');
$redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中

// 差集
$data = $redis->sdiff('animal', 'fruit');
var_dump($data); // 两次结果不一致

$data = $redis->sdiff('fruit', 'animal');
var_dump($data); // 两次结果不一致

其他

  • smove() 移动元素
$redis->sadd('animal', 'dog', 'cat');
$redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中

// smove(原集合,目标集合,需要移动的值)该方法返回一个布尔值
$data = $redis->smove('fruit', 'animal', 'bird');

var_dump($data);
  • sismember() 判断某个值是否在集合中
$redis->sadd('users', 'tom', 'jack', 'alex');
$bool = $redis->sismember('users', 'jason');

var_dump($bool);

有序集合

根据权重排序的集合

添加数据

  • zadd() 先有序集合中添加数据
// 1. 添加数据 zadd('集合', '权重', '值');
$redis->zadd('score', 10, 'tom');
$redis->zadd('score', 30, 'jack');
$redis->zadd('score', 60, 'alex');
$redis->zadd('score', 90, 'jason');

修改权重

  • zincrby() 更新有序集合中的某个值的权重(改变权重就会改变排序)
$redis->zadd('score', 10, 'tom');
$redis->zadd('score', 30, 'jack');
$redis->zadd('score', 60, 'alex');
$redis->zadd('score', 90, 'jason');

// 给 score 这个集合中的 tom 元素增加权重, 每次增加2
$data = $redis->zincrby('score', 2, 'tom');
var_dump($data);

获取

  • zrange() 获取有序集合中的一段数据(降序)
// 获取集合中的一段数据
$data = $redis->zrange('score', 0, -1); // 获取所有数据
$data = $redis->zrange('score', 0, 3);  // 获取从0开始到第3个位置的数据
  • zrevrange() 获取有序集合中的一段数据(升序)
// 正序
$data = $redis->zrange('score', 0, -1);
echo'<pre>';
print_r($data);
echo '</pre>';

// 倒序
$data = $redis->zrevrange('score', 0, -1);
echo'<pre>';
print_r($data);
echo '</pre>';
  • zrangebyscore() 根据权重排序(降序)
// 根据权重排序 zrangebyscore('需要排序的集合', 最低权重,最高权重, [widthscore=>true])
$data = $redis->zrangebyscore('score', 0, 100, ['widthscore'=>true]);
echo'<pre>';
print_r($data);
echo '</pre>';
  • zrevrangebyscore() 根据权重排序(升序)
// 根据权重排序 zrangebyscore('需要排序的集合', 最高权重, 最低权重, [widthscore=>true])
$data = $redis->zrevrangebyscore('score', 100, 0, ['widthscore'=>true]);
echo'<pre>';
print_r($data);
echo '</pre>';
  • zcount() 统计有序集合符合指定条件的元素个数
// `zcount` 统计有序集合中符合指定条件的元素个数
// zcount('需要统计的集合', '范围的最低权重', '范围的最高权重');
$count = $redis->zcount('score', 50, 100); // 返回一个整形的数字

echo'<pre>';
print_r($count);
echo '</pre>';
  • zsize() 查看有序集合中所有元素的个数
// zise  统计有序集合中的元素个数
echo $redis->zsize('score');
  • zscore() 查看有序集合中的某个元素的权重
echo $redis->zscore('sroce', 'tom');
  • zrank()zrevrank()
// 查看某个元素在有序集合中的元素按权重 `升序排序` 的位置的排名
$data = $redis->zrank('score', 'tom');
echo'<pre>';
print_r($data);
echo '</pre>';

// 查看某个有序集合中的元素按权重 `降序排序` 的排名
$data = $redis->zrevrank('score', 'tom');
echo'<pre>';
print_r($data);
echo '</pre>';

Memcache 和 Redis 的区别

  1. Redis 可以持久化数据, Memcache不能
  2. Redis 支持 string hash list set zsetmemcache 只支持 string 数据结构
  3. Redis 支持 master-slave 模式备份数据 (主从数据库,读写分离)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,672评论 18 139
  • 在Android Studio 创建新项目的时候,出现这个报错: Error:Execution failed f...
    JairusTse阅读 20,675评论 17 20
  • 水边城中闻酒香,遥寻酿香来源处。 只遇白洁卖酒女,霜雪凝聚成如雪。 倚天照海景...
    欧哈呐阅读 193评论 0 1
  • 一、三件印象深刻的事。 1.上课被叫起来了两次。 2.两个人手机被收了。 3.班里今天异常的活跃。 二、为什么? ...
    大壮二阅读 120评论 0 0
  • 1.对于跨年这一说向来是无感的。 高中不必多说。大学的时候,要么去了姐姐家,要么早早的回了大黄山,也没有什么印象。...
    屾的山阅读 155评论 0 0