Redis基础知识
1 Redis的简介
1.1 了解什么是redis
redis是一个开源的使用ANSI c语言编写、遵循BSA协议、支持网络、可基于内存亦可持久化的日志型、key-value数据库,
并提供多种语言的API。
他通常被称为数据结构服务器,因为值value可以是String、哈希(hash)、列表(list)、集合(sets)、和有序集合(sorted sets)等类型。
1.2 redis的特点
* Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
* Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
* Redis支持数据的备份,即master-slave模式的数据备份。
1.3 redis的优势
* 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
* 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
* 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,
即原子性,通过MULTI和EXEC指令包起来。
* 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
1.4 Redis支持的数据类型
* string(字符串)
* hash(哈希)
* list(列表)
* set(集合)
* zset或sorted set(有序集合)
2 Redis 命令
2.1 redis的运行
Redis 命令用于在 redis 服务上执行操作。
要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。 Redis 客户端的基本语法为: $ redis-cli 实例 以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。 $redis-cli redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING
在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。 在远程服务上执行命令 如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。 语法 $ redis-cli -h host -p port -a password
实例 以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上。 $redis-cli -h 127.0.0.1 -p 6379 -a "mypass" redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING
2.2 通用命令
1. keys :遍历出所有key:keys * 如下图所示 :
注意:keys命令一般不在生产环境使用,原因是假如key过多,会造成阻塞
2. dbsize :计算key的总数;
3. exists :exists key :检查可以是否存在 ;存在返回1,不存在返回0
4. del :删除指定的key-value;存在删除返回1,不存在返回0;如下图所示
expire key seconds:key在seconds秒后过期;
5. ttl key:查看key剩余的过期时间 ;-1 代表key存在,并且没有设置过期时间;-2 代表key不存在
6. persist key:去掉key的过期时间;
7. type key:返回key的类型;返回类型有:string、hash、list、set、zset、none
以上命令的时间复杂度:
keys :O(n)
dbsize :O(1)
del :O(1)
exists :O(1)
expire :O(1)
type :O(1)
3 redis的数据结构和内部编码
3.1 内部编码
4 redis的单线程
单线程为什么会这么快?
1. 纯内存
2. 非阻塞IO
3. 避免线程切换和竞太消耗
单线程注意什么?
1. 一次只运行一条命令
2. 拒绝长(慢)命令:keys,flushdb,slow lua script,mutil/exec,operate big vlalue(collection)
3. 其实不是单线程 如 fysnc file descriptor ,close file descriptor
5 redis的字符串类型的命令解析
- 结构和命令
- 内部编码
- 快速实战
- 查缺补漏
5.1 Redis的键值对结构
对于key-value:key是string,value是redis支持的数据结构
5.2 场景
- 缓存
- 计数器
- 分布式锁
- …
5.3 get、set、del命令的解析
get key:获取key对应的value O(1)
set key value:设置key-value O(1)
del key :删除key-value O(1)
5.4 incr、decr、incrby、decrby命令解析
incr key : key自增1,如果可以key不存在,自增后get(key)=1 ;O(1)
decr key : key自减1,如果key不存在,自减后get(key)=-1 ; O(1)
incrby key k : key自增k,如果key不存在,自增后get(key) = k;O(1)
decrby key k : key自减k,如果key不存在,自减后get(key) = -k;O(1)
5.5 setnx,set xx命令的解析
setnx key value: 如果key不存在,则设置key-value;
set key value xx: 更新key值为key的value为vlaue
5.6 mget、mset命令解析
mget key1 key2...:批量获取key,原子操作 O(n)
mset key1 value key2 value:批量设置key-value O(n)
5.7 getset、append、strlen命令的解析
getset key newvalue:set key newvalue并返回旧的value O(1)
append key value: 将value追加在旧value的后面 O(1)
strlen key : 返回字符串的长度(注意中文)
5.8 incrbyfloat、getrange、setrange命令解析
incrbyfloat key 3.5 :增加key对应值的3.5 O(1)
getrange key start end:获取字符串指定下标所有值 O(1)
setrnage key index value:设置指定下标所有对应的值 O(1)
5.9 字符串常用命令总结
6 redis的hash结构命令解析
所有hash的命令都是以h开头
6.1 命令解析
1. hget key field:获取hash key对应的field的value O(1)
2. hset key field value:设置hashkey对应field的value O(1)
3. hdel key field: 删除hash key对应field的value O(1)
命令演示如下图所示:
4. hexists key field:判断hash key是否有field O(1)
5. hlen key :获取hash key field的数量 O(1) 如下图所示
6. hmget key field1 field2… fieldN:批量获取hash key的一批field对应的值 O(1)
7. hmset key field1 value1 field2 value2… fieldN valueN O(n)
8. hgetall key:返回hash key对应所有的field和value O(n)
9. hvals key :返回hash key对应所有field的value O(n)
10. hkeys key:返回hash key对应所有field O(n)
注意:小心使用hgetall
假如存放数据多,redis是单线程的特点,hgetal命令就会很慢
6.1.1 hash命令的总结
6.2 实战
6.2.1场景描述
实现以下功能:
1 记录网站每个个人主页的访问量
2
6.2.2 使用的命令
hincrby user:1:info pageview count
7 redis的list结构命令解析
按照如下顺序详细解析list的命令,命令基本都是以”l”开头
- 增
- 删
- 改
- 查
7.1 插入命令解析
1. rpush key value1 value2…valueN:从列表右端插入(1~N)个值 O(1~n)
2. lpush key value1 value2…valueN:从列表左端插入(1~N)个值 O(1~n)
3. linsert key befor|after value newvalue:在list指定的值前|后插入newvalue O(n)
7.2 删除命令的解析
1. lpop key :从列表左侧弹出一个item O(1)
2. rpop key:从列表右侧弹出一个item O(1)
3. lrem key count value :根据count值,从列表中删除所有value相等的项,有一下几种情况
(1)count>0,从左到右,删除最多count个value相等的项
(2)count<0,从右到左,删除最多Math.abs(count)个value相等的项
(3)count=0,删除所有value相等的项
4. ltrim key start end:按照索引范围修剪列表 O(n)
5. lrange key start end(包含end):获取列表指定索引范围所有item O(n)
6. lindex key index:获取列表索引的item
7. llen key :获取列表长度
7.3 改命令解析
1. lset key index newvalue:设置列表指定索引为newvalue O(n)
7.4 查缺补漏
1. blpop key timeout:lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞 O(1)
2. brpop key timeout:rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞 O(1)
7.5 list命令总结
8 redis的集合结构命令解析
集合内的API,所有的命令都是以s开头的
8.1 命令解析
1. sadd key element:向集合key添加element(如果element已经存在,添加失败)O(1)
2. srem key element:将集合key中element移除掉 O(1)
3. scard 计算集合的大小
4. sismember key element:判断element是否在集合中
5. srandmember :从集合中随机挑count元素;语法:srandmember key count
6. spop key:从集合中随机弹出一个数
7. smembers key :获取集合中的所有数据 ,无序
8.2 set集合的总结
- 上一篇: 几种结构
- 下一篇: JVM初始化初步理解