Redis常用命令以及Redis在PHP中的使用方法

1、Redis安装 见 https://blog.csdn.net/niuxitong/article/details/90505794

使用场景

使用场景
1. 去最新n个数据的操作
2. 排行榜,取top n个数据 //最佳人气前10条
3. 精确的设置过期时间
4. 计数器
5. 实时系统, 反垃圾系统
6. pub, sub发布订阅构建实时消息系统
7. 构建消息队列
8. 缓存
使用场景
1. 去最新n个数据的操作
2. 排行榜,取top n个数据 //最佳人气前10条
3. 精确的设置过期时间
4. 计数器
5. 实时系统, 反垃圾系统
6. pub, sub发布订阅构建实时消息系统
7. 构建消息队列
8. 缓存

一、常用操作命令 

1、链接数据库

# 登录本机无密码直接 redis-cli  回车即可
# 本机有密码  redis-cli 回车 然后再输入  auth  password 

#登录第三方  redis-cli -h ip地址  -p 6379  -a password  
PHP 链接redis

$redis = new Redis();
$redis->connect('127.0.0.1', 6379) or die('Redis连接失败,是否开启了redis-server服务?');
//$redis->auth("23434");    // 如果有密码就启用此命令
//$redis->select(0);        // 选择指定数据库 默认为0    数字为0--15  共16个。

$redis->set('username', 'zhangsan');
echo $redis->get('username');

# select  2  选择2号数据库     (0--15) 

2、Key常用操作命令

1、keys *   返回所有键名
2、keys prefix* 返回所有以prefix开头的键 
3、keys prefix??        返回所有以prefix开头并且后面只有两个字母的键

4、exists  key  判断一个键是否存在,存在返回1 否则返回 0
5、del key  删除一个键,返回删除的个数
    del key1 key2   同时删除多个键
6、flushdb    清空当前数据库中所有键
7、flushall   清空所有数据库中的所有键(0--15号数据库) 
8、type  key 返回键的数据类型 


3、string 字符串类型

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
注意:在redis-cli.exe客户端
字符串类型的值,可以加双引号或单引号。
-->set username zhangsan
-->set username "zhangsan"
-->set username 'zhangsan'
这三种写法是等效的

1、set key value       //设置字符串键并赋值,成功 true  失败 false
    set key value  Ex 3600 //设置有效期3600秒
2、get kye             //获取键值

3、mset                //批量设置键值对 
   mset    key1 value1 key2 value2 ... 
   如: mset username "张三" sex "男" age 18
PHP:$redis->mset(array('username'=>"张三", 'sex'=>"男", 'age'=>18));

4、mget               //批量获取
语法:mget key1 key2
--> mget username sex age
返回:
1) "张三"
2) "男"
3) "18"
PHP:$arrs	= $redis->mget(array('username', 'sex'));
返回:Array([0]=>张三 [1]=>男);

5、setnx('key', 'value') //当指定键不存在时赋值 
当此键不存在时赋值,返回 1。 当存在时不赋值,返回 0
6、strlen key 	-- 返回指定键的值的长度,键不存在返回 0
-->set username "zhangsan"
127.0.0.1:6379> strlen username
(integer) 8     -- 返回 长度 8
PHP:
$int = $redis->strlen("username")  // 返回 int类型 8

7、incr key	-- 返回递增数字 没次递增1。
-->incr id
(integer) 1
-->incr id
(integer) 2
PHP:
$redis->incr('key')  = 1
$redis->incr('key')  = 2
$uid = $redis->incr('userid')	-- 多用于保存自增类型的id
扩展:incrby key 2  指定步长


8、decr key 	-- 递减数字 1
-->decr id
-->decr id
-->decr id
PHP:
$redis->set('num', 100)
$redis->decr('num')  -- 99
$redis->decr('num')  -- 98
扩展: decrby key 3  每次递减3

9、append('key', 'value')  --  向指定键的尾部追加值
当此键不存在时赋值,返回 1。 当存在时不复制,返回 0
$redis->set('username', 'niuhehe')
$redis->append('username', ' niuxixi')
$redis->append('username', ' niuhaha')
echo $redis->get('username')
输出 niuhehe niuxixi niuhaha

4、hash 散列类型(哈希类型)

散列类型类似于数据库中的表的一条记录,一个键下有多个字段 。主要用于保存一个键下多个字段、值的一行记录:如一篇文章的id、title、contents
hmset('post:id:1', 'id','1', 'title','标题', 'contents','内容');

1、hset   key  field  value   -- 设置散列键并赋值

-->hset goodsID:1 title  "苹果"
-->hset goodsID:1 price "3.50"
-->hset goodsID:1 addtime 1493014218
说明:hset不区分插入和更新操作,如果字段不存在,hset执行的是插入操作,返回1, 如果字段已存在,执行的是更新操作,返回0

PHP:
$redis->hset('goodsID:1', 'title', '苹果');
$redis->hSet('goodsID:1', 'price', "3.50");
$redis->hSet('goodsID:1', 'addtime', time());

2、hget  key field    -- 获取散列键中字段的值语法:hget key field
-->hget goodsID:1 title
-->hget goodsID:1 price
-->hget goodsID:1 addtime
PHP:
echo $redis->hGet('goodsID:1', 'title');
echo $redis->hGet('goodsID:1', 'price');
echo $redis->hGet('goodsID:1', 'addtime');

3、hmset        -- 批量设置字段的值, 成功返回true,
语法:hmset key  field1 value1  field2 value2 field3 value3;
-->hmset goodsID:2 title "香蕉" price "2.80"  addtime = 1493014228
-->hmset goodsID:2 title "橘子" price "3.30"  addtime = 1493014238
PHP:
$redis->hMset('goodsID:2',array('title'=>'香蕉', 'price'=>'2.80', 'addtime'=>time()));
$redis->hMset('goodsID:3',array('title'=>'橘子', 'price'=>'3.30', 'addtime'=>time()));

4、hmget('key', 'field1', 'field2') -- 批量获取字段的值。
语法:hmget key field1 field2...
--> hmget goodsID:3 title price addtime
输出:
1) "\xe6\xa9\x98\xe5\xad\x90"   // 橘子
2) "3.30"
3) "1493014218"

php中为数组:
$info = $redis->hMGet("goodsID:2", array('title', 'price'));
print_r($info);
输出:Array ([title]=>香蕉 [price]=>2.80);

5、hgetall  key   -- 获取指定键中的所有字段 
通常用于当我们不知道 key 键中有哪些字段 ,就全部打印出来

PHP返回数组:
$info = $redis->hGetAll("goodsID:3");
print_r($info);
输出:Array([title]=>橘子 [price]=>3.30 [addtime]=>1493018724)

6、hsetnx  key  field   --  当指定字段不存在时赋值,存在不赋值, 指定字段不存在返回true,存在返回false。

通常用于为指定的键增加新的字段和值

7、hexists   key field   -- 判断一个字段是否存在

PHP:
$res = $redis->hExists('goodsID:4', 'title');
var_dump($res);    // 返回的是布尔值,存在返回true  否则false

8、hlen('key')        -- 获得指定键中字段个数

9、hdel  key field                -- 删除指定键下的指定字段 返回被删除字段的个数
语法:hdel key field [,field2]
-->hdel goodsID:4 title price
PHP:
$res = $redis->hDel("goodsID:5",'title', 'price');
var_dump($res);   // int(2)
也可以使用:del goodsID:5  删除整个

10、   -- 只获取指定键的字段名称,而不显示字段值
-->hkeys goodsID:5
输出:
1) "title"
2) "price"
3) "addtime"
PHP:
$arr = $redis->hkeys("goodsID:5");
print_r($arr);
// Array ( [0] => title [1] => price [2] => addtime )

11、hvals  key       -- 只获取指定键的字段值,而不显示字段名
-->hkeys goodsID:5
输出:
1) "香蕉"
2) "2.25"
3) "1457876786"
PHP:
$list = $redis->hvals("goodsID:5");
print_r($list);
Array
(
    [0] => '香蕉.'
    [1] => '2.25'
    [2] => '值...'
    [3] => '1457876786'
)

5、List列表类型

主要用于保存文章的id序列,列表类型是通过双链表实现的,靠近两端的数据查询速度快,所以他更适合如实现“新鲜事”、“日志”这样的少访问中间元素的场景 。 


1、lpush  key  value  从左边插入--,返回值为增加元素值后的列表长度
语法:lpush key value [value2 value3 ...]
--> lpush postID 1
--> lpush postID 2
--> lpush postID a     // (integer) 3       //[ a 2 1 ]
PHP:
$res = $redis->lPush("goodsID", "0");
$res = $redis->lPush("goodsID", "a", "b", "c");    // [ c b a 0]

2、rpush key value  从右边插入

类似于字符串类型中的append('key', 'value')

3、lrange  key start stop    -- 获得列表片段(指定区域的元素值)

语法:lrange key start stop
返回索引值从start到stop之间的所有元素(包括两端)的值,Redis列表索引从0开始
start、stop 分别表示开始索引号、结束索引号
lrange  key 0 -1  获取所有 
PHP: 返回指定范围值的数组
$arr = $redis->lRange("postid", 0, 10);
Array ( [0] => a [1] => 2 [2] => 1 [3] => 1 [4] => b [5] => c )
$arr = $redis->lRange("postid", 2, 4);
Array ( [0] => 1 [1] => 1 [2] => b )

4、llen  key   -- 获取列表中元素的个数。
PHP:
$num = $redis->llent('goodsID');
echo $num      -- 8
php端可使用lSize('key') 也可以获取

5、lpop  key              
-- 从列表左边弹出一个元素(删除)并返回被删除的元素值
$res = $redis->lPop("postID");
echo $res;    // 删除了 a

6、rpop  key
-- 从列表右边弹出一个元素(删除)并返回被删除的元素值

7、lrem  key  count value             -- 删除列中指定个数的指定值
删除列中前 count个值为 value的元素,返回实际删除的元素个数:
(1)当count > 0 时,从左开始删除前count个值为value的元素
(2)当count < 0 时,从右边开始删除前count个值为value的元素
(3)当count = 0 时,删除所有值为value的元素
例: postID 的值为  [3 2 0 a b a c d f a b]
127.0.0.1:6379>lrem postID 2 a
(integer) 2    // 从左边开始删除两个a   变成了[3 2 0 b c d f a b]
PHP:
$redis->lRem("goodsID", "要删除的值", 个数);  //返回删除的个数
注意这里的参数顺序

8、lindex key index    -- 返回指定索引的元素值(索引从0开始)
如果index是负数,表示从右边开始计算索引, 最右边元素的索引值是-1;
例: postID  值为 [ 1 0 b c ]
127.0.0.1:6379>lindex postID 2
“b”
PHP:
$var = $redis->lIndex("postID", 2);
echo $var;   // b

9、lset key index value        -- 改变指定索引的值,成功返回真
例:lset postID 1 "zhangsan"  返回真
则此时  postID  值变成了 [ 1 zhangsan b c ]
PHP:
$var = $redis->lSet("postID", 2, "lisi");
var_dump($var);   返回真

10、ltrim            -- 删除指定索引范围之外的所有元素,(即保留此范围之内的元素)
语法:ltrim key start end 成功返回真
例:ltrim postID 2  5
删除 索引为0,1 以及6、7、8...的所有值,只保留索引在2--5范围内的值。
例: 只希望保留最近的100条日志。
lpush logList "日志内容"
ltrim logList 0 99   //只保留0--99的日志, 大于99的都删除掉
PHP:
$var = $redis->lTrim("postID", 0, 4);  返回真

11、linsert key before/after  privot  value;          
-- 向列表中(指定的位置)插入元素值
例: artList  [3 2 1];
linsert artList before 2 a  // 把元素值a插入到值2的前面
(integer) 4         // 成功返回元素个数,
linsert artList after 3 b  // 把元素值b插入到值3的后面
PHP:
$tag = $redis->lInsert('artlist', Redis::BEFORE, 'b', 'niuxitong');   //插入值b前面
$tag = $redis->lInsert('artlist', Redis::AFTER, 'b', 'niuhehe');//插入值b后面

12、rpoplpush key1 key2   -- 将元素从一个列表转移到另一个列表
语法:rpoplpush key1 key2   // 将列表key1里的最右边的值弹出并保存到key2的最左边
例:rpoplpush artlist  postList  // 把artlist里的最后一个值b弹出并存入postList的最左边。

 

6、set 集合类型

主要用于保存文章标签tag,集合类型里的元素是无序的,如我们一次插入多个值,每个值可能会打乱排列。使用集合类型保存tag,而不使用列表类型,主要是基于集合类型中元素不相同,而且可以实现搜索。

1、sadd              -- 创建一个集合类型键并增加至
语法:sadd key value [value2 value3 ....] 返回添加成功的元素个数,
例:
sadd tags one    -- 返回1
sadd tags one    -- 返回0  因为 one 已经存在
sadd tags two three 返回2,
PHP:
$redis->sadd('tags', 'one');
$redis->sadd('tags', 'two', 'three', 'one'); -- 返回 2,
在php中批量添加,是以 参数的形式添加的

2、srem              -- 从集合中删除一个或多个元素值,返回删除成功的个数
语法: srem key value [value2 value3]
例:
srem tags one       // 删除one 返回1
srem tags  aa bb    // 删除这两个值  返回2
PHP:
$tag = $redis->sRem("tags", "bb", "dd");
echo $tag;  // 返回2 成功删除两个

3、smembers  key          -- 获得集合的所有元素
例:smembers tags;   列出所有值
$tagArr = $redis->smembers('tags');
print_r($tagArr)
输出Array([0]=>three  [1]=>two  [2]=>one);    -- 返回元素值的索引数组

4、sismember  key value         -- 判断元素是否在集合中
语法: sismember key  value  存在返回1, 不存在返回 0
例: sismember tags niuxitong    存在返回1
PHP:
$tag = $redis->sIsMember("tags", "niuxitong");
echo $tag;    // 返回1
5、sdiff             -- 计算多个集合键之间的差集
语法:sdiff keyA keyB [keyC keyD ...]
集合A与集合B之间的差集表示 所有在集合A中存在,在集合B中不存在的元素。(B中存在,A中不存在的不考虑)如没有就返回空。
例:
sadd setA a b c
sadd setB b c d
127.0.0.1:6379> sdiff setA setB   // setA与setB的差集
1) "a"
127.0.0.1:6379> sdiff setB setA     // setB与setA的差集
1) "d"
sadd setC a e f   // 在增加一个集合setC
127.0.0.1:6379> sdiff setA setB setC
(empty list or set);   返回空
先计算setA - setB, 再计算得到的结果与 setC的差集。

PHP:
$arr = $redis->sDiff("setA", "setB");
var_dump($arr);
$arr = $redis->sDiff("setA", "setB", "setC");
var_dump($arr); // 没有值,返回一个空数组


6、sinter            -- 计算多个集合键之间的交集
语法:sinter keyA keyB [keyC keyD ...]
交集,表示在集合A中存在,同时也在集合比中存在的元素值。
例:
127.0.0.1:6379> sinter setA setB
1) "b"
2) "c"
127.0.0.1:6379> sinter setA setB setC
(empty list or set)
PHP:
$arr = $redis->sInter("setA", "setB");
print_r($arr);     // Array ( [0] => b [1] => c )
$arr = $redis->sInter("setA", "setB", "setC");
print_r($arr);     // Array ()

7、sunion            --  计算多个集合之间的并集, 表示所有元素组成的和
语法:sunion keyA keyB [keyC keyD ...]
127.0.0.1:6379> sunion setA setB
1) "b"
2) "a"
3) "c"
4) "d"
127.0.0.1:6379> sunion setA setB setC
1) "e"
2) "f"
3) "a"
4) "d"
5) "b"
6) "c"
PHP:
$arr = $redis->sUnion("setA", "setB");
print_r($arr);   //Array ( [0] => b [1] => a [2] => c [3] => d )

8、scard             -- 获取集合元素的个数
语法:scard key
127.0.0.1:6379> scard setA
(integer) 4
127.0.0.1:6379> smembers setA
1) "1"
2) "b"
3) "c"
4) "a"

9、spop              -- 随机从集合中弹出(删除)一个元素,并返回这个元素
语法:spop key
127.0.0.1:6379> spop setA
"a"
127.0.0.1:6379> spop setA
"b"
127.0.0.1:6379> smembers setA
1) "1"
2) "c"

7、有序集合(sorted set)

发送到发

1、zadd              -- 向有序集合中插入一个分数和对应元素,

如果元素已经存在,则会替换对应的分数。返回新插入的元素个数。
语法:zadd key 分数 元素  [分数 元素  分数 元素 ]
例:
127.0.0.1:6379> zadd clicks 89 niuxitong 90 liuhaiyun
(integer) 2
PHP:
$tag = $redis->zAdd("shijian", "30", "id1",  "20", "id2");
echo $tag;   // 添加了两个

2、zscore            -- 获得指定元素的分数
语法:zscore key 元素
例:
127.0.0.1:6379> zscore clicks niuxitong
"89"
PHP:
$tag = $redis->zScore("shijian", "id2");
echo $tag;     // 20

3、zrange            -- 获取排名在某个下标范围的元素列表,并按元素分数由小到大的顺序排列。
语法: zrange key start stop  [withiscores]
例:127.0.0.1:6379> zrange chengji 0 2
1) "Peter"
2) "Tom"
3) "niuhehe"
127.0.0.1:6379> zrange chengji 0 2 withscores // 同时获得元素的分数
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "niuhehe"
6) "95"

PHP:
$arr = $redis->zRange("chengji", 0, 2);
返回 :Array ( [0] => Peter [1] => Tom [2] => niuhehe )
$arr = $redis->zRange("chengji", 0, 2, 'withscores');
或者
$arr = $redis->zRange("chengji", 0, 2, true);

返回:Array ( [Peter] => 76 [Tom] => 89 [niuhehe] => 95 )

4、zrevrange         -- 用法与zrange基本一致,只是按元素分数由大到小的顺序排列。

5、zrangebyscore       -- 按元素分数从小到大的顺序返回一定范围内的元素
语法:zrangebyscore key min max [withscores] [limit offset count]
min 表示最低分(包含)
max 表示最高分(包含)
limit offset count  类似于SQL中的limit子句。
    offset 键的开始位置
    count 显示条数
例:
127.0.0.1:6379> zrangebyscore chengji 90 100
1) "niuhehe"
2) "David"
3) "niuxixi"
127.0.0.1:6379> zrangebyscore chengji 90 100 withscores
1) "niuhehe"
2) "95"
3) "David"
4) "100"
5) "niuxixi"
6) "100"
127.0.0.1:6379>

PHP:
注意在PHP中第四参数是以数组的形式设置其他参数的

array(
    'withscores'=>true,         // 显示分数
    'limit' => array(0, 2)      // 限定查询条数
)
$arr = $redis->zRangeByScore("chengji", 80, 100);
返回:Array ( [0] => Tom [1] => niuhehe [2] => David [3] => niuxixi )

$arr = $redis->zRangeByScore("chengji", 80, 100,array('withscores'=>true));
返回:Array ( [Tom] => 89 [niuhehe] => 95 [David] => 100 [niuxixi] => 100 )

$arr = $redis->zRangeByScore("chengji", 80, 100, array('withscores'=>true, 'limit' => array(0, 2)));
返回:Array ( [Tom] => 89 [niuhehe] =>95)


6、zrevrangebyscore       -- 按元素分数从大到小的顺序返回一定范围内的元素
语法:zrevrangebyscore key max min  [withscores] [limit offset count]
用法与zrangebyscore基本一致,不过max 与 min的顺序反了

127.0.0.1:6379> zrevrangebyscore chengji 100 80 withscores limit 1 3
1) "David"
2) "100"
3) "niuhehe"
4) "95"
5) "Tom"
6) "89"

7、zincrby             -- 增加某个元素的分数,返回更改后的分数
语法:zscore key 分数 元素
例:
127.0.0.1:6379> zscore chengji niuxixi
"102"
127.0.0.1:6379> zincrby chengji 1 niuxixi
"103"
127.0.0.1:6379> zincrby chengji 2 niuxixi
"105"
127.0.0.1:6379> zincrby chengji -1 niuxixi
"104"

8、zcard             -- 获得有序集合中元素的个数, 求列表总数
语法:acard    key
例:
127.0.0.1:6379> zcard chengji
(integer) 5
127.0.0.1:6379> zrange chengji 0 -1
1) "Peter"
2) "Tom"
3) "niuhehe"
4) "David"
5) "niuxixi"

9、zcount            -- 获得指定分数范围内的元素个数
语法:zcount key min max
用于按某一分数范围内统计个数
例:
127.0.0.1:6379> zcount chengji 95 110
(integer) 3
127.0.0.1:6379> zcount chengji (95  110
(integer) 2

10、zrem             -- 删除一个或多个元素,返回删除的元素个数
语法:zrem key 元素 [元素 元素 元素]
例:
127.0.0.1:6379> zrem key niuhehe
(integer) 0
127.0.0.1:6379> zrem chengji niuhehe
(integer) 1
PHP:
$tag = $redis->zRem("chengji", 2);  // 删除2 的元素
echo $tag;

11、zremrangebyrank  -- 按照元素排名下标范围删除元素
语法: zremrangebyrank key  start stop
zremrangebyrank命令按元素分数由小到大的顺序排列,删除在指定(下标)范围内的所有元素,并返回删除的个数
例:
127.0.0.1:6379> zremrangebyrank chengji 0 1
(integer) 2

12、zrank            -- 按元素分数从小到大的顺序获取指定元素的排名(即下标值)
语法:zrank key member

 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值