了解redis
redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。
redis的五种数据类型
Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合,无序的)和zset(sorted set有序集合)。
redis的版本为5.3.4
代码,详情请按照目录查看
字符串类型
public function testStringRedis()
{
// 字符串类型
// $redis = Redis::connection();
// $redis->set("string_name", "我是字符串类型的值");
// dd($redis->get("string_name"));
// 设置有效期,单位是秒(S)
// $redis = Redis::connection();
// $redis->setex('string_name', 50, '我是字符串类型的值s'); // 设置有效期为50秒的键值
// dd($redis->get("string_name"));
// 设置有效期,但是是毫秒(ms) 50000/1000 = 50
// $redis = Redis::connection();
// $redis->psetex('string_name', 50000, '我是字符串类型的值ms'); // 设置有效期为50秒的键值
// dd($redis->get("string_name"));
// 带条件的存储
// Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
// $redis = Redis::connection();
// $redis->setnx('string_name', '我是字符串类型的值_setnx_1');
// dd($redis->get("string_name"));
// 删除
// $redis = Redis::connection();
// $redis->del('string_name');
// dd($redis->get("string_name"));
// 是否存在
if (Redis::exists('string_name')) {
$value = Redis::get("string_name");
dd($value);
} else {
dd("从数据库里面取值");
}
}
hash类型
// 测试redis的基础类型hash
public function testHashRedis()
{
// hash
// $redis = Redis::connection();
// $redis->hset('test1', 'key1', 'v1');
// $redis->hset('test1', 'key2', 'v2');
// dd($redis->hget('test1', 'key1'));
// 增加一个元素
// Redis::hset("test", "key1", "v1_new");
// dd(Redis::hget("test", "key3"));
// 添加一个元素,判断
//Redis::hsetnx("test", "key4", "v4");
// hmset/hmget 存取多个元素到hash表
// Redis::hmset('test', array('key5' => 'v5', 'key6' => 'v6'));
// dd(Redis::hmget('test', array('key5', 'key6')));
// 删除
// Redis::hdel('test', 'key1');
// 返回hash的长度
// dd(Redis::hlen('test'));
// 返回hash表中的所有key
// dd(Redis::hkeys('test'));
// 返回hash表中的所有value
// dd(Redis::hvals('test'));
// 获取 hash 中所有的key-value
// dd(Redis::hgetall('test'));
// 返回hash表中的指定key是否存在
if (Redis::hexists('test', 'key1')) {
dd(Redis::hget("test", "key1"));
} else {
dd("不存在,可以从数据库取");
}
dd(111);
}
list类型
// 测试redis的list类型
public function testListRedis(){
// 左添加 在左(头部)添加数据到list中 不存在时创建 返回值为添加元素后list的长度
// Redis::lpush('list', 1);
// Redis::lpush('list', 2);
// Redis::lpush('list', 3);
// 左添加 在左(头部)添加数据到list1中 不存在时不创建 返回0
// Redis::lpushx('list1', 3);
// 右添加, 在右(尾部)添加数据到list中 不存在时创建 返回值为添加元素后list的长度
// Redis::rpush('list', 4);
//在右(尾部)添加数据到list中 不存在时不创建 返回0
// Redis::rpushx("list1", 3);
// 从左(头部)取出list中数据 返回值为取出的数据 若不存在当前key的话,返回nul
// 取出的是头部第一个元素,就删除了此元素
// dd(Redis::lpop('list'));
// 4.从右(尾部)取出list中数据 返回值为取出的数据
// 取出的是尾部第一个元素,就删除了此元素
// dd(Redis::rpop('list'));
// 获取该key中所有数据 是个数组
// dd(Redis::lrange('list', 0, -1));
// 获取key为list的list集合中 索引为0的数据
// dd(Redis::lindex('list', 0));
// 将list集合中索引为0的value值改为3
// Redis::lset("list", 0, 3);
// 获取该list的长度
// dd(Redis::llen('list'));
// 只保留索引0到索引1的value值 其余的都删除
// Redis::lpush('list', 4);
// Redis::lpush('list', 5);
// Redis::lpush('list', 6);
// Redis::ltrim("list", 0, 1);
// 删除list列表右边的最后一个元素将其追加到list1列表,list1不存在会创建 返回值为那个元素的value值
Redis::rpoplpush('list','list1');
dd(1111111);
}
set 无序
// 测试redis的无序集合 set
public function testSetRedis(){
// 添加
// Redis::sadd("set", 1);
// Redis::sadd("set", 2);
// Redis::sadd("set", 3);
// 移除指定元素
// Redis::srem("set", 1);
// 弹出首个元素
// Redis::spop("set");
// 移动当前set集合的指定元素到另一个set集合
//
// 1.若移动的是set里面的最后一个元素,则set就会被删除
// 2.若set1不存在,则会自动创建
// Redis::sadd('set1', 1);
// // 把set里面的2移动到set1里面
// Redis::smove('set', 'set1', 2); // 移动
// 返回当前set表元素个数
//
// 判断元素是否属于当前set集合
// dd(Redis::sismember("set", 2));
// 返回当前set集合的所有元素
// dd(Redis::smembers("set"));
// 交集
// dd(Redis::sinter("set", "set1"));
// 并集
// dd(Redis::sunion("set", "set1"));
// 补集
// dd(Redis::sdiff("set", "set1"));
// 交集以后到第三张表
// 等同于将'set1'的内容copy到'ste2'中,并将'set2'转为set1表
// Redis::sinterstore('set2', 'set1');
// 将'set'和'set2'中相同的元素 copy 到'set3'表中, 覆盖'set3'原有内容
Redis::sinterstore('set3','set', 'set2');
dd(11111);
}
set 有序
// 测试redis的有序集合 set
public function testZSetRedis(){
// 1.增加元素,并设置序号,成功返回true,重复返回false
// Redis::zadd('zset', 1, 1);
// Redis::zadd('zset', 2, 2);
// Redis::zadd('zset', 3, 3);
// 2.对指定元素索引值的增减,改变元素排列次序
// 把value为1的排序改为4+1则是5
// Redis::zincrby("zset", 4, 1);
// 3.移除指定元素
// Redis::zrem("zset", 2);
// 4.按位置次序返回表中指定区间的元素,正序
// // // 返回位置 0 和 5 之间(两个)的元素
// dd(Redis::zrange("zset", 0, 5));
// // 返回位置 0 和倒数第一个元素之间的元素(相当于所有元素)
// dd(Redis::zrange("zset", 0, 1));
// 5.同上,返回表中指定区间的元素,按次序倒排
// dd(Redis::zrevrange("zset", 0, 5));
// 6.按顺序/降序返回表中指定索引区间的元素
// Redis::zadd('zset1', 1, serialize(array("key1"=>"value1")));
// Redis::zadd('zset1', 2, serialize(array("key2"=>"value2")));
// Redis::zadd('zset1', 3, serialize(array("key3"=>"value3")));
// 返回索引值1-2之间的元素
// dd(Redis::zrangebyscore('zset1', 1, 2));
// 返回索引值1-2之间的元素并包含索引值
// dd(Redis::zrangebyscore('zset1', 1, 2, array('withscores'=>true)));
// limit 'limit'=>array(1, 2),表示偏移1条,返回2条
// dd(Redis::zrangebyscore('zset1', 1, 2, array('withscores'=>true, "limit" => array(0,2))));
// 7.统计一个索引区间的元素个数
// dd(Redis::zcount('zset1', 1, 2));
// 8.统计元素个数
// dd(Redis::zcard("zset1"));
// 9.查询元素的索引
// dd(Redis::zscore('zset', 1));
// 10.删除一个索引区间的元素
// Redis::zremrangebyscore('zset1', 0, 2); // 删除索引在0-2之间的元素
// 11.zrank/zrevrank 返回元素所在表顺序/降序的位置(不是索引)
// dd(Redis::zrank("zset", 1));
// dd(Redis::zrevrank ("zset", 1));
// 12.删除表中指定位置区间的元素
Redis::zadd('zset', 1, 1);
Redis::zadd('zset', 3, 3);
Redis::zadd('zset', 4, "val4");
Redis::zadd('zset', 5, "val5");
Redis::zadd('zset', 6, "val6");
dd(Redis::zremrangebyrank('zset', 1, 3)); //删除位置为1-3的元素,返回删除的元素个数
dd(1111);
}
详情
一、String类型的存储以及读取
1.长时间存储,没有过期时间,ttl为-1
// 字符串类型
$redis = Redis::connection();
$redis->set("string_name", "我是字符串类型的值");
dd($redis->get("string_name"));
2.设置有效期,单位是秒(S),ttl为设置的时间
$redis = Redis::connection();
$redis->setex('string_name', 50, '我是字符串类型的值'); // 设置有效期为50秒的键值
dd($redis->get("string_name"));
大家可以看到,ttl就有时间了
3.设置有效期,单位是毫秒(ms),ttl为设置的时间
// 设置有效期,但是是毫秒(ms) 50000/1000 = 50
$redis = Redis::connection();
$redis->psetex('string_name', 50000, '我是字符串类型的值ms'); // 设置有效期为50秒的键值
dd($redis->get("string_name"));
4.带条件的存储
// Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
$redis = Redis::connection();
$redis->setnx('string_name', '我是字符串类型的值_setnx');
dd($redis->get("string_name"));
因此在执行3的时候是有过期时间的,因此这个的值为最新设置的,并且ttl为-1
再次执行这次命令,更改value的值,看执行结果,还是之前的数据
5.删除
$redis = Redis::connection();
$redis->del('string_name');
dd($redis->get("string_name"));
6.是否存在
// 是否存在
if (Redis::exists('string_name'))
{
$value = Redis::get("string_name");
dd($value);
} else {
dd("不存在,从数据库里面取值");
}
二、Hash类型的以及读取
1.存
// hash
$redis = Redis::connection();
$redis->hset('test', 'key1', 'v1');
$redis->hset('test', 'key2', 'v2');
dd($redis->hget('test', 'key1'));
再来一个看看区别
$redis = Redis::connection();
$redis->hset('test1', 'key1', 'v1');
$redis->hset('test1', 'key2', 'v2');
dd($redis->hget('test1', 'key1'));
2.增加一个元素
Redis::hset("test", "key3", "v3");
dd(Redis::hget("test", "key3"));
若直接用此命令添加元素,若之前存在就直接覆盖了,验证,以前的value是v1
Redis::hset("test", "key1", "v1_new");
dd(Redis::hget("test", "key3"));
3.添加一个元素,判断是否存在
白话就是若存在则不保存,还是以前的数据,不存在的时候才是本次存入的数据
a.key2此键值以前存在,不会更新value值
Redis::hsetnx("test", "key2", "va_new");
b.key4不存在,则插入
Redis::hsetnx("test", "key4", "v4");
4. 存取多个元素到hash表
Redis::hmset('test', array('key5' => 'v5', 'key6' => 'v6'));
dd(Redis::hmget('test', array('key5', 'key6')));
5.删除hash表中指定key的元素
Redis::hdel('test', 'key1');
6.返回hash表元素个数
// 返回hash的长度
dd(Redis::hlen('test'));
7.返回hash表中的所有key
dd(Redis::hkeys('test'));
8.返回hash表中的所有value
dd(Redis::hvals('test'));
9.获取 hash 中所有的key-value
dd(Redis::hgetall('test'));
10.返回hash表中的指定key是否存在
// 返回hash表中的指定key是否存在
if (Redis::hexists('test', 'key1')) {
dd(Redis::hget("test", "key1"));
} else {
dd("不存在,可以从数据库取");
}
三.Set 无序类型的存储与访问
1.添加
注意:新增返回TRUE,重复返回FALSE
// 添加
Redis::sadd("set", 1);
Redis::sadd("set", 2);
Redis::sadd("set", 3);
2.移除指定元素
Redis::srem("set", 1);
3.弹出首元素
Redis::spop("set");
4.移动当前set集合的指定元素到另一个set集合
// 1.若移动的是set里面的最后一个元素,则set就会被删除
// 2.若set1不存在,则会自动创建
Redis::sadd('set', 1);
// 把set里面的2移动到set1里面
Redis::smove('set', 'set1', 2); // 移动
5.返回当前set表元素个数
dd(Redis::scard("set"));
6.判断元素是否属于当前set集合
dd(Redis::sismember("set", 2));
7.返回当前set集合的所有元素
dd(Redis::smembers("set"));
8.返回两个表中元素的交集/并集/补集
准备工作:set里面有[1],set1里面有[1,2]
交集
dd(Redis::sinter("set", "set1"));
并集
dd(Redis::sunion("set", "set1"));
补集
dd(Redis::sdiff("set", "set1"));
8.将两个表交集/并集/补集元素 copy 到第三个表中
交集
单表
// 等同于将'set1'的内容copy到'ste2'中,并将'set2'转为set1表
Redis::sinterstore('set2', 'set1');
多表
// 将'set'和'set2'中相同的元素 copy 到'set3'表中, 覆盖'set3'原有内容
Redis::sinterstore('set3','set', 'set2');
并集
参考交集
补集
参考交集
四、有序set表操作
1.增加元素,并设置序号,成功返回true,重复返回false
Redis::zadd('zset', 1, 1);
Redis::zadd('zset', 2, 2);
Redis::zadd('zset', 3, 3);
2.对指定元素索引值的增减,改变元素排列次序
// 把value为1的排序改为4+1则是5
Redis::zincrby("zset", 4, 1);
3.移除指定元素
Redis::zrem("zset", 2);
4.按位置次序返回表中指定区间的元素,正序
// 返回位置 0 和 5 之间(两个)的元素
dd(Redis::zrange("zset", 0, 5));
// 返回位置 0 和倒数第一个元素之间的元素(相当于所有元素)
dd(Redis::zrange("zset", 0, 1));
5.同上,返回表中指定区间的元素,按次序倒排
dd(Redis::zrevrange("zset", 0, 5));
6.按顺序/降序返回表中指定索引区间的元素
- 值返回
Redis::zadd('zset1', 1, serialize(array("key1"=>"value1")));
Redis::zadd('zset1', 2, serialize(array("key2"=>"value2")));
Redis::zadd('zset1', 3, serialize(array("key3"=>"value3")));
// 返回索引值1-2之间的元素
dd(Redis::zrangebyscore('zset1', 1, 2));
- 索引值
// 返回索引值1-2之间的元素并包含索引值
dd(Redis::zrangebyscore('zset1', 1, 2, array('withscores'=>true)));
- limit
// array(0,1), 是返回1个元素, array(0,2)是返回2个元素
dd(Redis::zrangebyscore('zset1', 1, 2, array('withscores'=>true, "limit" => array(0,1))));
7. 统计一个索引区间的元素个数
//
dd(Redis::zcount('zset1', 1, 2));
//'(3'表示索引值在3-5之间但不含3,同理也可以使用'(5'表示上限为5但不含5
dd(Redis::zcount('zset1', '(3', 5));
8.统计元素个数
dd(Redis::zcard("zset1"));
9.查询元素的索引
dd(Redis::zscore('zset', 1));
10. 删除一个索引区间的元素
原始数据入下:
Redis::zremrangebyscore('zset1', 0, 2); // 删除索引在0-2之间的元素
11.zrank/zrevrank 返回元素所在表顺序/降序的位置(不是索引)
zrank
dd(Redis::zrank("zset", 1));
zrevrank
dd(Redis::zrevrank ("zset", 1));
12.删除表中指定位置区间的元素,不是索引
原始数据
Redis::zadd('zset', 1, 1);
Redis::zadd('zset', 3, 3);
Redis::zadd('zset', 4, "val4");
Redis::zadd('zset', 5, "val5");
Redis::zadd('zset', 6, "val6");
dd(Redis::zremrangebyrank('zset', 1, 3)); //删除位置为1-3的元素,返回删除的元素个数
五.list类型
1.左添加
不存在时创建
Redis::lpush('list', 1);
Redis::lpush('list', 2);
Redis::lpush('list', 3);
不存在时不创建
Redis::lpushx('list1', 3);
在查看结果的时候是没有list1的
2.右添加
不存在时创建
Redis::rpush('list', 4);
不存在时不创建
Redis::rpushx("list1", 3);
依然没有list1
3.从左(头部)取出list中数据 返回值为取出的数据 若不存在当前key的话,返回null
// 取出的是头部第一个元素,就删除了此元素
dd(Redis::lpop('list'));
4.从右(尾部)取出list中数据 返回值为取出的数据
// 取出的是尾部第一个元素,就删除了此元素
dd(Redis::rpop('list'));
5.获取该key中所有数据 是个数组
dd(Redis::lrange('list', 0, -1));
6.获取key为list的list集合中 索引为0的数据
dd(Redis::lindex('list', 0));
7.将list集合中索引为0的value值改为3
Redis::lset("list", 0, 3);
8.获取该list的长度
dd(Redis::llen('list'));
9.只保留索引0到索引1的value值 其余的都删除
Redis::lpush('list', 4);
Redis::lpush('list', 5);
Redis::lpush('list', 6);
Redis::ltrim("list", 0, 1);
10.删除list列表右边的最后一个元素将其追加到list1列表,list1不存在会创建 返回值为那个元素的value值
Redis::rpoplpush('list','list1');
还没有整理完,有时间了,继续整理添加……