通用命令
通用命令
redis-cli -p 6382 # 打开客户端
- keys 键
127.0.0.1:6382> keys * # 遍历所有key
127.0.0.1:6382> dbsize # 计算key总数
127.0.0.1:6382> mset hello world hehe haha php good phe his
OK
127.0.0.1:6382> keys he* #可以使用通配符匹配
1) "hehe"
2) "hello"
127.0.0.1:6382> keys he[h-l]*
- dbsize 计算key总数
127.0.0.1:6382> dbsize
(integer) 5
127.0.0.1:6382> sadd myset a b c d e
(integer) 5
127.0.0.1:6382> dbsize
(integer) 6
- exists key 判断key是否存在
127.0.0.1:6382> exists myset
(integer) 1
127.0.0.1:6382> exists myset1
(integer) 0
- del key [key,…] 删除key
127.0.0.1:6382> del myset phe
(integer) 2
127.0.0.1:6382> del php
(integer) 1
- expire key seconds 设置key过期时间
ttl key 查看key的过期时间
persist key 去掉key的过期时间
127.0.0.1:6382> set hello world
OK
127.0.0.1:6382> expire hello 20
(integer) 1
127.0.0.1:6382> ttl hello
(integer) 15
127.0.0.1:6382> persist hello
(integer) 1
127.0.0.1:6382> ttl hello
(integer) -1 # -1代表key存在,且没有过期时间
- type key 数据类型
以上6个命令的时间复杂度
注意:keys命令一般不在生产环境中使用
那keys * 怎么用- 热备从节点
- scan
数据结构和内部编码
字符串
结构和命令
键为字符串,值为字符串,数字,位图,也可以将列表或字典序列化成为字符串存储,数据最大可为512MB,但是建议不宜超过100kB,否则会对其他命令造成影响。
缓存命令
** 计数命令**
127.0.0.1:6382> exists php
(integer) 0
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> setnx php bad
(integer) 0
127.0.0.1:6382> set php best xx
OK
127.0.0.1:6382> get php
"best"
127.0.0.1:6382> exists lua
(integer) 0
127.0.0.1:6382> set lua hehe xx
(nil)
批量操作
批量操作可以省去大量的网络时间
快速实战
记录网站每个用户个人主页的访问量?
incr userid:pageview(单线程:无竞争)
缓存视频的基本信息,数据源在MySQL(伪代码)
内部编码
查漏补缺
哈希
特点
一个key可以有多个属性和值
特点:
- Mapmap结构,map里又包含一个map
- field不能相同,value可以相同
hash vs string
重要API
以h开头
127.0.0.1:6382> hset user:1:info age 23
(integer) 1
127.0.0.1:6382> hset user:1:info name gfgf
(integer) 1
127.0.0.1:6382> hgetall user:1:info # 获取全部属性
1) "age"
2) "23"
3) "name"
4) "gfgf"
127.0.0.1:6382> hdel user:1:info age
(integer) 1
127.0.0.1:6382> hgetall user:1:info
1) "name"
2) "gfgf"
127.0.0.1:6382> hexists user:1:info name
(integer) 1
127.0.0.1:6382> hlen user:1:info
(integer) 1
快速实战
记录网站每个用户个人主页的访问量?
hincrby user:1:info pageview count
缓存视频的基本信息,数据源在MySQL(伪代码)
查缺补漏
列表
特点
- 有序
- 可以重复
- 左右两边可以插入弹出
API
以L开头
- 右边插入
- 从左边插入
- 插入
- 删除
保留索引范围内的值 - 查
查缺补漏
单线程架构
redis每次只执行一条命令,执行完之后才会执行下一条命令
单线程为什么这么快?
- 纯内存(主要原因)
redis数据都是放在内存中的,内存的执行速度非常快 - 非阻塞IO
redis使用像epoll这样的模型,作为I/O多路复用的实现,将epoll的连接和关闭转化为自己的事件,不在网络IO上浪费过多的时间。 - 避免线程切换和竞态消耗
使用单线程要注意什么?
- 一次只运行一条命令
- 拒绝长(慢)命令(一条内存命令的响应时间为100ns,如果一条命令太过占时,会影响之后的命令)
- 其实不是单线程
fysnc file descreptor ,close file descreptor等命令会有独立的线程来做