一、Redis初映象
高性能的key-value服务器
多种数据结构(区别于memcached)
丰富的功能
高可用分布式支持
二、相识
2-1、Redis初识
2-1-1、Redis是什么
开源(短小,精悍)、key-value基于键值的存储服务系统(Java中的Map)、多种数据结构(String、Hash Tables、Linked Lists、Sets、Sorted Sets)、高性能
2-1-2、Redis的特性
- 速度快(10W OPS)
数据===》 内存中
什么语言===》 C语言(5万行,最近版本)
线程模型===》 单线程
读写对比
- 持久化(断电不丢数据)
Redis所有数据保持在内存中,对数据的更新将异步的保存到磁盘上 - 多种数据结构,5种,其他为衍生
String、Hash Tables、Linked Lists、Sets、Sorted Sets
BitMaps:位图(属于String)
HyperLogLog:超小内存唯一值计算
GEO:地理信息定位() - 支持多种编程语言
Java 、PHP 、Ruby 、LUA - 功能丰富(发布订阅)
发布订阅
Lua脚本
事务
pipeline - 简单(代码,使用)
单机的开发版(2万多行)
3之后,增加集群功能
不依赖外部库
单线程模型 - 主从复制
- 高可用、分布式
高可用===》Redis-Sentinel(V2.8)支持高可用
分布式===》Redis-Cluster(V3.0)支持分布式
2-1-3、Redis的典型应用场景
缓存系统
计数器(转发数,评论数,点赞,播放次数)
消息队列系统(发布订阅,简单的消息队列。专业=》kafka)
排行榜(视频、游戏,有序集合)
社交网络(天然适合,微博)
实时系统(布隆过滤器?,位图)
(Linux)redis安装
1、安装wget
yum -y install wget
2、下载redis
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
3、解压
tar xzf redis-5.0.8.tar.gz
4、建立软连接,方便管理
ln -s redis-5.0.8 redis
5、切换到redis目录
cd redis
6、编译
make
7、安装
make install
src目录下
redis-benchmark # 压力测试,基准测试
redis-check-aof # 较完成持久化,AOF文件修复工具
redis-check-rdb # redis默认持久化,适合大面积
redis-check-dump # RDB文件修复工具
redis-cli # 连接客户端
redis-sentinel # 高可用 。哨兵机制
redis-server # 服务端
8、启动,任意目录,三种方式
1、redis-server默认启动
2、指定端口启动:redis-cli -p 6380
**3、(生产环境建议)使用配置文件进行启动**单机多实例区分管理
/opt目录下
修改redis.conf文件
daemonize yes 以守护进程方式启动
port 6381 端口
dir “/opt/soft/redis/data” 工作目录
logfile "6381.log" 日志
指定配置文件进行启动
redis-server config/redis-6381.conf
查看进程进行验证ps -ef | grep redis
Redis客户端 redis-cli -h -p
2-2、API的使用
-
通用命令
通用命令
keys # 遍历所有的key,太重,O(n),生产不要使用;热备从节点;scan
dbsize # 计算key的总数,计数器,O(1)
exists key # 是否存在key,存在返回1,不存在返回0,O(1)
del key # 删除key,成功删除返回1,O(1)
expire key seconds # 为key设置有效时间,缓存场景,O(1)
ttl key # 查看key剩余的过期时间,-2代表key已不存在;-1代表key存在,并且没有设置过期时间
persist key # 去掉key的过期时间
type key 数据类型,O(1)
数据结构和内部编码
单线程架构
使用注意:
1、一次只运行一条命令
2、拒绝长命令(keys,flushall,flushdb)
3、其实不是单线程(比如文件操作) -
字符串类型
结构和命令
get获取、set设置、del删除
incr计数自增1 O(1),如果key不存在,自增后get(key)=-1
decr 自减1,如果key不存在,自减get(key)=-1
incrby key k key自增k,如果key不存在,自增后get(key)=k
decr key k # key自减k,如果key不存在,自减后get(key)=-k
set key value # 不管key是否存在,都设置
setnx key value # key不存在,才设置(add操作)
set key value xx # key存在,才设置(update操作)
mget key1 key2 # 批量获取,原子操作O(n),n次get = n次网络时间+n次命令时间
mset key1 value1 key2 value2 # 批量设置key-value,O(n)
使用场景:缓存、计数器(单线程无竞争)、分布式锁等
getset key newvalue # set key newvalue并返回旧的value,O(1)
append key value # 将value追加到旧的value,O(1)
strlen key # 返回字符串的长度(注意中文),O(1)
incrbyfloat # 浮点类型,增加key对应的值
getrange key start end # 获取字符串指定下标所有的值,计数从0开始
setrange key index value # 设置指定下标所有对应的值
内部编码 -
哈希类型
-
列表类型
-
集合类型
-
有序集合类型