NoSQL之redis

一、关于Redis

Redis是一个key-value存储系统,官方站点 http://redis.io 和memcached类似,但支持数据持久化 支持更多value类型,除了string外,还支持hashlists(链表)sets(集合)sorted sets(有序集合)数据类型

二、数据类型

1、String类型

1.1、赋值set key value、取值get key

set username jack
+OK
get username
$4
jack
set passwd 12345678
+OK
get passwd
$8
12345678
DEL w3ckey

1.2、setnx 如果key存在,则返回0,不存在会直接创建这个key

setnx username jjj
:0

1.3、setex 【expires 过期】 setex key expires 通过ttl来查看当前的过期时间

setex username 120 kkkk
+OK
ttl username
:114
ttl username
:106
keys *
*1
$6
passwd
ttl username
:-2

4、mset 批量去设置一批 key-value

mset key1 value1 key2 value2 key3 value3

2、hash了类型常用命令

1、hset

 hset hash1 key1 value1
 hset hash1 key2 value2
 hset hash1 key3 value3
 hset hash1 key4 value4

 hget hash1 key3 
 hgetall hash1

2、hmset 批量创建

hmset hash1 key1 value1 key2 value2
hmget hash1 key1 key2

3、hdel

127.0.0.1:6379> hget hash1 key1
"value1"
127.0.0.1:6379> hdel hash1 key1
(integer) 1

4、hkeys hash1 所有键

127.0.0.1:6379> hkeys hash1
1) "key2"

5、hvals hash1 所有的值

127.0.0.1:6379> hvals jack
1) "zhongzhong"
2) "laonie"
3) "18"

6、hlen hash1 查看hash1有多少个字段 return int

127.0.0.1:6379> hlen jack
(integer) 3

3、list数据常用命令

1、lpush左插 rpush右插

127.0.0.1:6379> lpush list1 a
(integer) 1
127.0.0.1:6379> lpush list1 b
(integer) 2
127.0.0.1:6379> lpush list1 c
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"

lrange 0开始 -1end结束

2、lpop rpop 用于移除并返回列表的最后一个元素

127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist word
(integer) 2
127.0.0.1:6379> rpush mylist jack
(integer) 3
127.0.0.1:6379> lrange 0 3
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange mylist 0 3
1) "hello"
2) "word"
3) "jack"
127.0.0.1:6379> rpop mylist
"jack"
127.0.0.1:6379> lrange mylist 0 3
1) "hello"
2) "word"
127.0.0.1:6379> 

3、linsert lista before v1 v2 在vi前插入v2 没有rinsert

4、lset lista 4 bbb 把第五个元素修改成bbb 4是下标

5、lindex lista 1 查看第二个元素 只是读 和pop是拿出来

6、llen lista 查看几个元素

4、set集合数据常用命令

1、sadd set1 value1 赋值

2、smembers set1 查看 【 tab键可补全命令 大写】

3、srem set1 value1

4、spop set1 随机的挤出删除

5、sdiff set1 set2 比较差集 以set1为基准

6、比较差集存储 sdiffstore set3 set2 set1 存储到set3

7、sinter set1 set2 求交集

8、交集存储 sinterstore set4 set1 set2 存set4 smembers

9、sunion seta setb 求并集

10、sunion sete seta setb 并集存储

11、sismember seta aaa 判断一个元素是否属于一个集合 返回int 1 0

12、srandmember seta 随机取出一个元素,但是不删除

5、有序集合zset常用命令

1、zadd zset1 1 abc、 zadd zset1 10 1abc 1和10排序值 【分值】

2、zrange zset1 0 -1 zrange zset1 0 -1 withsocres 显示元素对应的分值 zrevrange zset1 0 -1 反序显示所有的元素,并带分值

3、zrem zset1 value1

4、zrank zset1 value2 返回索引值

5、zrevrank zset1 反序显示所有的元素

6、zcard zset1 返回 集合中所有元素的个数

7、zcount zseta 1 10 返回分值范围1-10的元素个数

8、zrangbyscore zseta 1 10 返回分值范围1-10的元素

9、zremrangebyrank zseta 0 2 删除索引范围0-2的元素 按score正向正向排序

10、zremrangebyscore zseta 1 10 删除分值范围1-10的元素

四、键值和服务器命令

1、keys * 取出所有key

2、keys my* 模糊匹配

3、exists name 有name键 返回1 否则返回0

4、del key1 删除一个key 成功返回1 否则返回0

5、expire key1 100 设置key1 100s后过期 另外-》 setex key 10

6、ttl key 查看键 还有多少时间过期,单位s;

  • 当key不存在时,返回-2.
  • 当key存在但没有设置剩余剩余时间 -1
  • 否则返回key的剩余生存时间

7、select 0 代表选择当前数据库默认进入0数据库

8、move age 1把age移动到1数据库

9、persist key 取消key的过期时间

10、randomkey 随机返回一个key

11、rename oldname newname 重命名key

12、type key1 返回键key1的类型

五、服务器操作

1、dbsize 返回当前数据库中key的数目

2、info 返回redis数据库状态信息

3、flushdb 清空当前数据库中所有的键

4、flushall 清空所有数据中所有的key

六、设置安全验证

1、查看是否设置了密码验证

127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。

2、设置安全验证

127.0.0.1:6379> config set requirepass 'niege'
OK

七、PHP和redis使用实例

1、用作数据缓存

header('content-type:text/html;charset=utf-8');

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 缓存数据
$redis->set('cache-key', json_encode([
                                      'data-list' => '这个聂哥准备的缓存数据~'
                                    ]), JSON_UNESCAPED_UNICODE);

echo "字符串缓存成功~ <br/>";

// 获取缓存数据
$data = $redis->get('cache-key');

echo "读取缓存数据为: \n";
echo '<pre>';
print_r(json_decode($data,true));

2、用作消息队列

项目中使用消息队列的场景:

  • 把瞬间大量访问服务器的请求处理换成异步处理,
  • 实现数据顺序排列获取

1、进入队列

header('content-type:text/html;charset=utf-8');
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('jackisok');

$array = ['A','B','C','D','E','F','G','H'];

foreach( $array as $val ){
    $redis->rpush('jack_list',$val);
}

2、处理队列数据

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);
$redis->auth('jackisok');

$handle = $redis->lpop('jack_list');

if( $handle ){
    echo '有一个兄台出列了:'.$handle.'<hr/>';
}else{
    echo '出列完成';
}

3、指定计划任务

[root@localhost ~]# crontab -l
*/1 * * * *  php //www/webs/api/nosql/insert.php
*/2 * * * *  php //www/webs/api/nosql/handle.php

聂哥建议看看: http://www.scienjus.com/redis-use-case/ http://blog.csdn.net/nuli888/article/details/51865401