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 的区别
- Redis 可以持久化数据, Memcache不能
- Redis 支持
string
hash
list
set
zset
而memcache
只支持string
数据结构 - Redis 支持
master-slave
模式备份数据 (主从数据库,读写分离)