Redis数据类型
大图先上:
Redis不仅仅是缓存:
1、先从Redis缓存里查询数据 如果没有再到Mysql、Pgsql数据库里查询
2、db磁盘I/O瓶颈问题
优势:
1〉速度快
2〉键值对的数据结构服务器
3〉丰富的功能:
4〉简单稳定
5〉持久化
6〉主从复制
8〉高可用和分布式转移
9〉客户端语言多
应用场景:
1,缓存数据库:
2,排行榜
3,计数器应用
4,社交网络
5,消息队列(守护进程)
6, 其它场景等
String类型案例:
echo “
”;
//存取值
Redis::set(‘name’,‘dashuaige’);
echo Redis::get(‘name’);
a
r
r
=
[
′
n
a
m
e
′
=
>
′
许
煜
乾
大
帅
哥
′
,
′
a
g
e
′
=
>
18
,
′
l
i
k
e
′
=
>
′
迪
丽
热
巴
′
]
;
/
/
批
量
存
取
值
直
接
存
数
组
,
这
里
自
动
获
取
之
后
也
是
数
组
R
e
d
i
s
:
:
m
s
e
t
(
arr = [ 'name'=>'许煜乾大帅哥', 'age'=>18, 'like'=>'迪丽热巴' ]; //批量存取值 直接存数组,这里自动获取之后也是数组 Redis::mset(
arr = [ ′name′=>′许煜乾大帅哥′, ′age′=>18, ′like′=>′迪丽热巴′ ]; //批量存取值 直接存数组,这里自动获取之后也是数组 Redis::mset(arr);
print_r(Redis::mget([‘name’,‘age’,‘like’]));
//追加
Redis::append(‘name’,‘真的帅’);
//删除数据 delete可以删除一个或者多个,
$res = Redis::del(‘name’);
print_r(Redis::mget([‘name’,‘age’,‘like’]));
echo “”;
哈希类型案例
echo “
”;
//存储单个
Redis::hset(‘user:1’,‘name’,‘xuyuqian’);
//获取单个
echo Redis::hget(‘user:1’,‘name’),"
";
//批量存储多个
a
r
r
=
[
′
n
a
m
e
′
=
>
′
h
u
a
n
g
q
i
n
t
a
n
g
′
,
′
a
g
e
′
=
>
50
,
′
l
i
k
e
′
=
>
′
肥
婆
′
]
;
R
e
d
i
s
:
:
h
m
s
e
t
(
′
u
s
e
r
:
2
′
,
arr = [ 'name'=>'huangqintang', 'age'=>50, 'like'=>'肥婆' ]; Redis::hmset('user:2',
arr = [ ′name′=>′huangqintang′, ′age′=>50, ′like′=>′肥婆′ ]; Redis::hmset(′user:2′,arr);
//卧槽这两个既然相等
print_r(Redis::hmget(‘user:2’,[‘name’,‘age’,‘like’]));
print_r(Redis::hgetall(‘user:2’));
//del能能直接删除诶批量删除
//Redis::del(‘user:2’);
Redis::hdel(‘user:2’,‘name’); //hdel是专门删除hash单个值的
print_r(Redis::hgetall(‘user:2’));
echo “”;
哈希跟string区别
1,原生:set user:1:name Pack
set user:1:age 18; set user:1:sex man;
优点:简单直观,每个键对应一个值
缺点:键数过多,占用内存多,用户信息过于分散,不用于生 产环境
2,将对象序列化存入redis
set user:1 serialize(userInfo);
优点:编程简单,若使用序列化合理内存使用率高
缺点:序列化与反序列化有一定开销,更新属性时需要把 userInfo全取出来进行反序列化,更新后再序列化到redis
3,使用hash类型:
hmset user:1 name Luke age 18 sex man
优点:简单直观,使用合理可减少内存空间消耗
缺点:要控制ziplist与hashtable两种编码转换,且hashtable 会消耗更多内存erialize(userInfo);
List类型的实例
//好像不能批量插入,只能用循环一个个插入
// for(
i
=
1
;
i = 1;
i = 1; i<= 10;KaTeX parse error: Expected '}', got 'EOF' at end of input: …'test:list:3', i);
// }
//获取全部
dump(Redis::lrange(‘test:list:3’,0,-1));
//删除一个
//Redis::rpop(‘test:list:3’);
dump(Redis::lrange(‘test:list:3’,0,-1));
// //批量删除
// Redis::ltrim(‘test:list:1’,0,0);
// dump(Redis::lrange(‘test:list:1’,0,-1));
Set集合的实例
/*
* 无序集合
* 求出并集自动去重
* sunion key1 key2
* 求出交集
* sinter key1 key2
* 求出差集
* sdiff key1 key2 以key1集合为主,谁在前谁是主
*/
//添加
Redis::sadd(‘class:1’,‘name’,‘age’,‘like’);
a
r
r
=
[
′
n
a
m
e
′
,
′
a
g
e
11
1
′
,
′
l
i
k
e
′
]
;
R
e
d
i
s
:
:
s
a
d
d
(
′
c
l
a
s
s
:
2
′
,
arr = ['name','age111','like']; Redis::sadd('class:2',
arr=[′name′,′age111′,′like′];Redis::sadd(′class:2′,arr);
//获取多个
dump(Redis::smembers('class:2'));
//删除
dump(Redis::del('class:2'));
dump(Redis::smembers('class:2'));
echo "--------------------------------------------------------------------","<br>";
/*
* 有序集合
*/
//添加
Redis::zadd('class:3',5,'name');
Redis::zadd('class:3',6,'name1');
Redis::zadd('class:3',4,'name2');
//获取
dump(Redis::zrange('class:3',0,-1));
//删除
dump(Redis::del('class:3'));
dump(Redis::zrange('class:3',0,-1));
无序集合应用特点:
标签,社交,查询有共同兴趣爱好的人,智能推荐
使用方式:
给用户添加标签:
sadd user:1:skill mysql redis kafka
sadd user:2:skill kafka rabbitmq
…
或给标签添加用户
sadd basball:users user:1 user:2
sadd fball:users user:1 user:2
…
计算出共同感兴趣的人:
sinter user:1:fav user2:fav
有序集合应用特点:
常用于排行榜,如游戏需要对充值数据做排行榜,或社交网站点赞数 与集合有联系,不能有重复的成员
集合跟list的区别:
全局命令:
1,查看所有键:
keys * set school enjoy set hello world
2,键总数 :
dbsize //2个键,如果存在大量键,线上禁止使用此指令
3,检查键是否存在:
exists key //存在返回1,不存在返回0
4,删除键:
del key //del hello school, 返回删除键个数,删除不存在键返回0
5,键过期:
expire key seconds //set name test expire name 10,表示10秒过期
ttl key // 查看剩余的过期时间
6,键的数据结构类型:
type key //返回string,键不存在返回none
一个订单的消息队列