第一章 redis初识
1.1 Redis是什么
介绍
开源:早起版本2w3千行
基于键值对的存储系统:字典形式
多种数据结构:字符串,hash,列表,集合,有序集合
高性能,功能丰富
那些公司在用
github,twitter,stackoverflow,阿里,百度,微博,美团,搜狐
1.2 Redis特性(8个)
速度快:10w ops(每秒10w读写),数据存在内存中,c语言实现,单线程模型
持久化:rdb和aof
多种数据结构:
5大数据结构
BitMaps位图:布隆过滤器 本质是 字符串
HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串
GEO:地理信息定位 本质是有序集合
支持多种编程语言:基于tcp通信协议,各大编程语言都支持
功能丰富:发布订阅(消息) Lua脚本,事务(pipeline)
简单:源代码几万行,不依赖外部库
主从复制:主服务器和从服务器,主服务器可以同步到从服务器中
高可用和分布式:
2.8版本以后使用redis-sentinel支持高可用
3.0版本以后支持分布式
1.3 Redis单机安装
1.3.1下载安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
|
1.3.2三种启动方式
1.3.2.1 最简启动
1.3.2.2 动态参数启动
1.3.2.2 配置文件启动
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
|
1.3.3 客户端连接(命令)
1.3.4 redis返回值
1.4 Redis典型使用场景
缓存系统:使用最广泛的就是缓存
计数器:网站访问量,转发量,评论数(文章转发,商品销量,单线程模型,不会出现并发问题)
消息队列:发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者)
排行榜:有序集合(阅读排行,点赞排行,推荐(销量高的,推荐))
社交网络:很多特效跟社交网络匹配,粉丝数,关注数
实时系统:垃圾邮件处理系统,布隆过滤器
第二章 API的使用
一 通用命令
1.1 通用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
|
1.2 数据结构和内部编码
1.3 单线程架构
1.3.1 单线程架构,
一个瞬间只会执行一条命令
1.3.2 单线程为什么这么快
1 纯内存
2 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间
3 避免线程间切换和竞态消耗
1.3.3 注意
1 一次只运行一条命令
2 拒绝长慢命令
-keys,flushall,flushdb,慢的lua脚本,mutil/exec,operate,big value
3 其实不是单线程(在做持久化是另外的线程)
-fysnc file descriptor
-close file descriptor
二 字符串类型
2.1 字符串键值结构
1 2 3 4 5 6
|
key value hello world 可以很复杂,如json格式字符串 counter 1 数字类型 bits 10101010 二进制(位图)
|
2.2 常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
|
三 哈希类型
###3.1 哈希值结构
3.2 重要api
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
|
3.3 hash vs string
3.3.1相似的api
get | hget |
set /sentnx |
hset hsetnx |
del |
hdel |
incr incrby dear decrby |
hincrby |
mset |
hmset |
mget |
hmget |
3.3.2 缓存三种方案
直接json格式字符串
每个字段一个key
使用hash操作
3.4 其他操作
四 列表类型
4.1 列表特点
有序队列,可以从左侧添加,右侧添加,可以重复,可以从左右两边弹出
4.2 API操作
4.2.1 插入操作
4.2.2 删除操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
lpop key
|
4.2.3 查询操作
1 2 3 4 5 6 7 8 9
|
lrange key start end
|
4.2.3 修改操作
1 2
|
lset key index newValue
|
4.3 实战
实现timeLine功能,时间轴,微博关注的人,按时间轴排列,在列表中放入关注人的微博的即可
4.4 其他操作
1 2 3 4 5 6 7 8 9 10 11
|
blpop key timeout
|
五 集合类型
5.1 特点
无序,无重复,集合间操作(交叉并补)
5.2 API操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
sadd key element
|
5.3 实战
抽奖系统 :通过spop来弹出用户的id,活动取消,直接删除
点赞,点踩,喜欢等,用户如果点了赞,就把用户id放到该条记录的集合中
标签:给用户/文章等添加标签,sadd user:1:tags 标签1 标签2 标签3
给标签添加用户,关注该标签的人有哪些
共同好友:集合间的操作
5.4 总结
sadd:可以做标签相关
spop/srandmember:可以做随机数相关
sadd/sinter:社交相关
六 有序集合类型
6.1 特点
6.2 API使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
zadd key score element
|
6.3 实战
排行榜:音乐排行榜,销售榜,关注榜,游戏排行榜
6.4 其他操作
6.5 总结
操作类型 | 命令 |
基本操作 |
zadd/ zrem/ zcard/ zincrby/ zscore |
范围操作 |
zrange/ zrangebyscore/ zcount/ zremrangebyrank |
集合操作 |
zunionstore/ zinterstore |
Redis
redis安装
1 2 3 4
|
""" 1、官网下载:安装包或是绿色面安装 2、安装并配置环境变量 """
|
redis VS mysql
1 2 3 4 5 6
|
""" redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定) mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)
大量访问的临时数据,才有redis数据库更优 """
|
redis VS memcache
1 2 3 4
|
""" redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回(默认持久化,主动持久化save)、可以将数据同步给mysql) | 高并发支持 memcache: 操作字符串 | 不支持数据持久化 | 并发量小 """
|
Redis操作
启动服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
""" 前提:前往一个方便管理redis持久化文件的逻辑再启动服务:dump.rdb 1)前台启动服务 >: redis-server
2)后台启动服务 >: redis-server --service-start 注)Linux系统后台启动(或是修改配置文件,建议采用方式) >: redis-server &
3)配置文件启动前台服务 >: redis-server 配置文件的绝对路径
4)配置文件启动后台服务 注)windows系统默认按Redis安装包下的redis.windows-service.conf配置文件启动 >: redis-server --service-start 注)Linux系统可以完全自定义配置文件(redis.conf)后台启动 >: redis-server 配置文件的绝对路径 & """
""" windows系统 1)前台启动 i)打开终端切换到redis安装目录 >: cd C:AppsRedis ii)启动服务 >: redis-server redis.windows.conf
2)后台启动 i)打开终端切换到redis安装目录 >: cd C:AppsRedis ii)启动服务(后面的配置文件可以省略) >: redis-server --service-start redis.windows-service.conf """
|
密码管理
1 2 3 4 5 6 7 8 9 10
|
""" 1)提倡在配置文件中配置,采用配置文件启动 requirepass 密码
2)当服务启动后,并且连入数据库(redis数据库不能轻易重启),可以再改当前服务的密码(服务重启,密码重置) config set requirepass 新密码
3)已连入数据库,可以查看当前数据库服务密码 config get requirepass """
|
连接数据库
1 2 3 4 5 6 7 8 9 10 11
|
""" 1)默认连接:-h默认127.0.0.1,-p默认6379,-n默认0,-a默认无 >: redis-cli
2)完整连接: >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码
3)先连接,后输入密码 >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 >: auth 密码 """
|
切换数据库
1 2 3 4
|
""" 1)在连入数据库后执行 >: select 数据库编号 """
|
关闭服务
1 2 3 4 5 6 7 8
|
""" 1)先连接数据库,再关闭redis服务 >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码 >: shutdown
2)直接连接数据库并关闭redis服务 >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码 shutdown """
|
清空redis数据库
1 2 3 4
|
""" 1)连接数据库执行 >: flushall """
|
数据持久化
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
""" 1)配置文件默认配置 save 900 1 # 超过900秒有1个键值对操作,会自动调用save完成数据持久化 save 300 10 # 超过300秒有10个键值对操作,会自动调用save完成数据持久化 save 60 10000 # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化
2)安全机制 # 当redis服务不可控宕机,会默认调用一下save完成数据持久化(如果数据量过大,也可能存在部分数据丢失)
3)主动持久化 >: save # 连入数据库时,主动调用save完成数据持久化
注:数据持久化默认保存文件 dump.rdb,保存路径默认为启动redis服务的当前路径 """
|
redis相关配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
""" 1)绑定的ip地址,多个ip用空格隔开 bind 127.0.0.1
2)端口,默认6379,一般不做修改 port 6379
3)是否以守护进程启动,默认为no,一般改为yes代表后台启动(windows系统不支持) daemonize no
4)定义日志级别,默认值为notice,有如下4种取值: debug(记录大量日志信息,适用于开发、测试阶段) verbose(较多日志信息) notice(适量日志信息,使用于生产环境) warning(仅有部分重要、关键信息才会被记录) loglevel notice
5)配置日志文件保持地址,默认打印在命令行终端的窗口上 如果填写 "./redis.log" 就会在启动redis服务的终端所在目录下,用redis.log记录redis日志 logfile ""
eg)终端首先切断到log文件夹所在目录(一般就可以采用redis的安装目录,也可以自定义),再启动reids服务 logfile "./log/redis.log"
6)数据库个数,默认是16个,没特殊情况,不建议修改 databases 16
7)数据持久化 save 900 1 # 超过900秒有1个键值对操作,会自动调用save完成数据持久化 save 300 10 # 超过300秒有10个键值对操作,会自动调用save完成数据持久化 save 60 10000 # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化
8)数据库持久化到硬盘失败,redis会立即停止接收用户数据,让用户知道redis持久化异常,避免数据灾难发生(重启redis即可),默认为yes,不能做修改 stop-writes-on-bgsave-error yes
9)消耗cpu来压缩数据进行持久化,数据量小,但会消耗cpu性能,根据实际情况可以做调整 rdbcompression yes
10)增持cpu 10%性能销毁来完成持久化数据的校验,可以取消掉 rdbchecksum yes
11)持久化存储的文件名称 dbfilename dump.rdb
12)持久化存储文件的路径,默认是启动服务的终端所在目录 dir ./
13)reids数据库密码 requirepass 密码 """
|
Redis数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
""" 数据操作:字符串、列表、哈希(字典)、无序集合、有序(排序)集合 有序集合:游戏排行榜 字符串: set key value get key mset k1 v1 k2 v2 ... mget k1 k2 ... setex key exp value incrby key increment 列表: rpush key value1 value2 ... lpush key value1 value2 ... lrange key bindex eindex lindex key index lpop key | rpop key linsert key before|after old_value new_value 哈希: hset key field value hget key field hmset key field1 value1 field2 value2 ... hmget key field1 field2 hkeys key hvals key hdel key field 集合: sadd key member1 member2 ... sdiff key1 key2 ... sdiffstore newkey key1 key2 ... sinter key1 key2 ... sunion key1 key2 ... smembers key spop key 有序集合: zadd key grade1 member1 grade2 member2 ... zincrby key grade member zrange key start end zrevrange key start end """
|
python使用redis
依赖
直接使用
连接池使用
1 2 3
|
import redis pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, max_connections=100, password=None, decode_responses=True) r = redis.Redis(connection_pool=pool)
|
缓存使用:要额外安装 django-redis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
|