redis (二)

来源:互联网 发布:联合国商品数据库 编辑:程序博客网 时间:2024/06/05 19:34
数据类型—>使用—>返回值—>场景—>mysql =>nosql

返回:
个数|是否修改|存在性|类型|秒数 -1(已过期) -2(不存在)
空字符串|旧值|头尾元素或中间元素|返回随机值

场景:
--rpoplpush source dest
作用: 把source的尾部拿出,放在dest的头部,
并返回 该单元值
 
场景: task + bak 双链表完成安全队列
Task列表                             bak列表
   
 
   

 
业务逻辑:
1:Rpoplpush task bak
2:接收返回值,并做业务处理
3:如果成功,rpop bak 清除任务. 如不成功,下次从bak表里取任务


--brpop ,blpop  key timeout
作用:等待弹出key的尾/头元素,
Timeout为等待超时时间
如果timeout为0,则一直等待
 
场景: 长轮询Ajax,在线聊天时,能够用到

--Setbit 的实际应用
redis 127.0.0.1:6379> setbit mon 100000000 0
(integer) 0
redis 127.0.0.1:6379> setbit mon 3 1
(integer) 0
redis 127.0.0.1:6379> setbit mon 5 1
(integer) 0
redis 127.0.0.1:6379> setbit mon 7 1
(integer) 0
redis 127.0.0.1:6379> setbit thur 100000000 0
(integer) 0
redis 127.0.0.1:6379> setbit thur 3 1
(integer) 0
redis 127.0.0.1:6379> setbit thur 5 1
(integer) 0
redis 127.0.0.1:6379> setbit thur 8 1
(integer) 0
redis 127.0.0.1:6379> setbit wen 100000000 0
(integer) 0
redis 127.0.0.1:6379> setbit wen 3 1
(integer) 0
redis 127.0.0.1:6379> setbit wen 4 1
(integer) 0
redis 127.0.0.1:6379> setbit wen 6 1
(integer) 0
redis 127.0.0.1:6379> bitop and  res mon feb wen
(integer) 12500001




事务:
watch(乐观锁) multi exec discard (只是结束了本次事务,语句造成的影响还在,这是和mysql 的区别)
aof(慢一些,但冲写成语句后更精简,就是说把数据逆化成了命令) vs rdb(更快 更大)
                
运维案例:
1.如果不小心运行了flushall,立即shutdown nosave ,关闭服务器
然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.
如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.

2.Slowlog 显示慢查询
:多慢才叫慢?
: slowlog-log-slower-than 10000 ,来指定,(单位是微秒)
服务器储存多少条慢查询的记录?
答: 由 slowlog-max-len 128 ,来做限制

3.运行时更改master-slave
修改一台slave(设为A)为new master
1) 命令该服务不做其他redis服务的slave
   命令: slaveof no one
2) 修改其readonly为yes
其他的slave再指向new master A
1) 命令该服务为new master A的slave
   命令格式 slaveof IP port

mysql:
书签系统
create table book (
bookid int,
title char(20)
)engine myisam charset utf8;
 
insert into book values
(5 , 'PHP圣经'),
(6 , 'ruby实战'),
(7 , 'mysql运维')
(8, 'ruby服务端编程');
 
 
create table tags (
tid int,
bookid int,
content char(20)
)engine myisam charset utf8;
 
insert into tags values
(10 , 5 , 'PHP'),
(11 , 5 , 'WEB'),
(12 , 6 , 'WEB'),
(13 , 6 , 'ruby'),
(14 , 7 , 'database'),
(15 , 8 , 'ruby'),
(16 , 8 , 'server');
 
# 既有web标签,又有PHP,同时还标签的书,要用连接查询
 
select * from tags inner join tags as t on tags.bookid=t.bookid
where tags.content='PHP' and t.content='WEB';
 
 

 
换成key-value存储
用kv 来存储
set book:5:title 'PHP圣经'
set book:6:title 'ruby实战'
set book:7:title 'mysql运难'
set book:8:title ‘ruby server’
 
sadd tag:PHP 5
sadd tag:WEB 5 6
sadd tag:database 7
sadd tag:ruby 6 8
sadd tag:SERVER 8
 
查: 既有PHP,又有WEB的书
Sinter tag:PHP tag:WEB  #查集合的交集
 
查: 有PHP或有WEB标签的书
Sunin tag:PHP tag:WEB
 
查:含有ruby,不含WEB标签的书
Sdiff tag:ruby tag:WEB #求差集
 
 
 
 

 
Redis key 设计技巧
 
1: 把表名转换为key前缀 如, tag:
2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid
3: 第3段放置主键值,如2,3,4...., a , b ,c
4: 第4段,写要存储的列名
 
用户表 user  , 转换为key-value存储useridusernamepasswordeemail9Lisi1111111lisi@163.com
 
set  user:userid:9:username lisi
set  user:userid:9:password 111111
set  user:userid:9:email   lisi@163.com
 
keys user:userid:9*
 
 
2 注意:
在关系型数据中,除主键外,还有可能其他列也步骤查询,
如上表中, username 也是极频繁查询的,往往这种列也是加了索引的.
 
转换到k-v数据中,则也要相应的生成一条按照该列为主的key-value
Set  user:username:lisi:uid  9 
 
这样,我们可以根据username:lisi:uid ,查出userid=9,
再查user:9:password/email ...
 
完成了根据用户名来查询用户信息
redis
插件的使用
// get instance
$redis = new Redis();
 
// connect to redis server
$redis->open('localhost',6380);
$redis->set('user:userid:9:username','wangwu');
var_dump($redis->get('user:userid:9:username'));
0 0