2019独角兽企业重金招聘Python工程师标准>>>

其他

事务

Redis中事务是一组命令的集合, 一个事务中的命令要么都执行, 要么都不执行

> MULTI
> SADD k1 v1
> SADD k2 v2
> EXEC

注意, 不支持回滚功能

SORT

可以对列表/集合/有序集合进行排序

最强大最复杂, 用不好可能成为性能瓶颈 O(n + mlogm) n为排序个数, m为返回个数

>SORT key #从小到大
>SORT key DESC #从大到小

SORTBY

127.0.0.1:6379> LPUSH sortbylist  2 1 3
(integer) 3
127.0.0.1:6379> SET itemscore:1 50
OK
127.0.0.1:6379> SET itemscore:2 100
OK
127.0.0.1:6379> SET itemscore:3 -10
OK
127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC
1) "2"
2) "1"
3) "3"

SORTBY GET

127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC GET POST:*->title GET POST:*->time

SOTRBY GET STORE

127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC GET POST:*->title GET POST:*->time STORE new_key

生存时间

TTL, time to live

时效数据,过一定时间删除这些数据

#设置
>EXPIRE key seconds
1表示设置成功, 0表键不存在或设置失败#查询
>TTL key
键不存在返回-1 or 没有设置生存时间#去除时效
>PERSIST key#SET/GETSET为键赋值会同时清除键的生存时间

任务队列

一般队列

生产者 LPUSH
消费者 RPOPBRPOP 和RPOP类似,但是当列表中没有元素时,BRPOP会一直阻塞住链接,直到有新元素加入

优先队列

BLPOP key [key ...] timeout,同时检测多个键,如果所有键都没有元素则阻塞,如果其中有一个键有元素,则从该键中弹出元素
如果都有,则从左到右的顺序取第一个键中的一个元素BLPOP queue:1 queue:2 queue:3 0

发布/订阅模式

进程间消息传递

订阅者:订阅者可以订阅一个或多个频道

>SUBSCRIBE channel1

发布者:可以向指定的频道发送消息,所有订阅此频道的订阅者都会受到此消息

>PUBLISH channel1 helloworld

Python中使用Redis

官方推荐redis-py

安装

sudo pip install redis
sudo easy_install redis

使用

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py>>> import redis>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)>>> r.set('foo', 'bar')True>>> r.get('foo')'bar'

connection pool

管理对一个redis server的所有连接,避免每次建立、释放连接的开销。
默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)

pipeline机制

可以在一次请求中执行多个命令,这样避免了多次的往返时延
当一组命令中每条命令都不依赖于之前的执行结果, 可以使用pipe = r.pipeline()
pipe.set('one', 'first')
pipe.set('two', 'second')
pipe.execute()pipeline中的操作是原子的,要改变这种方式,可以传入transaction=Falsepipe = r.pipeline(transaction=False)

实际实例

什么应用,都用什么方式处理的

1.一般的缓存

用字符串类型足矣, e.g.注册时得用户名冲突,在线用户

>SET key value
>GET

一些缓存场景

存储会话缓存(Session Cache), 利用持久化, 保存一些信息, 例如购物车
全页缓存(FPC)

2.计数,访问量统计,自增id等

>INCR key

3.存储对象实例

用散列
>HSET key field value
>HGET key field

4.存列表,队列相关

作为队列使用

文章分类列表,评论列表等

用列表
>LPUSH key value
>RPUSH key value>LPOP key
>RPOP key

5.集合相关的

标签云等

>SADD key member
>SREM key member

6.排序相关

排行榜

访问量排序,点击量等

用有序结合
>ZADD key score member

7.访问频率控制

设置key的失效时间 用 INCR 访问时检查次数, 若超过阈值, 走限制逻辑

or 记录次数, 超过阈值, 检查与最早一个相差是不是1分钟, 是, 走限制逻辑, 不是, 现有时间加入列表, 同时删除最早元素

8.发布/订阅

会用到的

管理

重启后数据不丢失, 两种方式, 可单独使用或者结合使用

持久化:

RDB

快照,符合一定条件时,将内存中的所有数据进行快照并存储到硬盘上
快照的条件可以在配置文件中配置, 两个参数: 时间和改动的键的个数
Redis默认采用的持久化方式过程
1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程) (存的是fork时刻的数据)写时复制copy-on-write 开始时父子共享同一内存数据, 当父进程修改某片数据, 操作系统复制一份以保证子进程数据不受影响
2. 父进程继续接收命令, 子进程开始将内存中数据写入硬盘中临时文件
3. 写入结束后, 替换旧的RDB文件任意时刻rdb文件都是完整地, 可以用于备份可以手动发SAVE / BGSAVE 让redis执行快照(前者由主进程进行快照操作,阻塞其他请求, 后者fork子进程)

AOF

每次执行一条会修改Redis中数据的命令,Redis会将该命令写到硬盘中的AOF文件
开启, 设置 appendonly yes
默认文件名 appendonly.aof 可以通过appendfilename设置纯文本文件, 每当达到一定条件时可以进行重写
auto-aof-rewrite-percentage 100 #超过上一次百分比
auto-aof-rewrite-min-size 64mb #允许重写的最小aof文件大小默认30s, 执行的命令同步到aof
可以配置
appendfsync everysec # 每秒一次

Redis可以配置主从数据库

redis-server --port 6380 --slaveof 127.0.0.1 6379

复制原理: 从数据库启动, 向主库发SYNC, 主库后台开始保存快照(RDB), 并将保存期间的命令缓存起来. 快照完成后, 将快照文件和缓存的命令发送给从库, 从库收到后载入快照文件并执行命令. 不支持断点续传

读写分离: 主库禁用持久化, 从库启用. 从库崩溃, 重启自动更新. 主库崩溃, 从库提升为主库再修复

常用查看命令

telnet连接

>telnet 127.0.0.1 6379

设定最大可用内存

如果服务器内存有限, 大量使用缓存且生存时间设置过长会导致Redis占满内存. or 为了防止占用内存过大而将生存时间设太短导致命中率过低

可以限制redis使用的最大内存, 按照一定规则淘汰不需要的键

配置文件
maxmemory 限制最大可用内存大小(单位字节)
maxmemory-policy 超过限制时的删除策略,一直删除直到小于指定内存volatile-lru  使用LRU算法删除一个键,只对设置了生存时间的
allkeys-lru   使用LRU算法删除一个键
volatile-random 随机,只对设置了生存时间的
allkeys-random
volatile-ttl    删除生存时间最近的
noeviction      不删除键,返回错误

耗时命令日志

> SLOWLOG GET

其他

批量删除

#删除 /test/*开始的
./redis-cli -a password -n 0 keys "/test/*" | xargs ./redis-cli -a password -n 0 del

精简键名和键值, 最直观的减少内存占用的方式


The end! To be continue ....

转载于:https://my.oschina.net/airship/blog/616979

Redis基础笔记 (二)相关推荐

  1. Redis基础笔记(下)

    Redis基础(下) Linux命令 1.cd:更改目录 cd~回到初始目录 cd - 回到上级目录 2.mkdir 创建目录 3.cp 拷贝文件 eg:cp redis 5.06/redis.con ...

  2. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  3. Redis基础笔记--自认为很详细(●ˇ∀ˇ●)

    1.Redis 学习笔记 2.Redis 简介 Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库, Redis 这个名字是 Remote Dict ...

  4. MATLAB 基础笔记(二):常用矩阵的生成

    笔记二是简单介绍常用矩阵的生成 目录 笔记二是简单介绍常用矩阵的生成 1.零矩阵的生成 2.单位矩阵的生成 3.全1矩阵的生成 4.随机整数向量生成 5.生成指定对角线元素矩阵 6.生成对角矩阵 7. ...

  5. Redis基础(二)—— 基本命令与数据类型

    1.Redis基本命令 # 切换数据库SELECT index # 当前数据库有的数据量DBSIZE # 清空当前数据库内容FLUSHDB # 清空所有数据库内容FLUSHALL 1.1 key # ...

  6. python基础笔记二_面向对象

    面向对象 Object Oriented 概述 面向过程 1.分析出解决问题的步骤,然后逐步实现.例如:婚礼筹办-- 发请柬(选照片.措词.制作)-- 宴席(场地.找厨师.准备桌椅餐具.计划菜品.购买 ...

  7. 计算机专升本基础笔记二 进制转换及二进制运算规则

    进制转换及二进制运算规则   什么是进制?     进制就是进位计数制,是人为定义的带进位的计数方法.我们的时间就是六十进制(满60秒进一分钟,满60分钟进1小时):对于任何一种进制-X进制,就表示每 ...

  8. 【笔记】iOS开发基础笔记二

    1.block 2.didReceiveMemoryWarning 使用 3.HTTP,TCP,UDP 答: HTTP是应用层协议,定义的是传输数据的内容的规范 HTTP协议中的数据是利用TCP协议传 ...

  9. Redis基础(二)——通用命令和配置

    文章目录 通用命令和配置 通用命令和配置 // CMD启动redis redis-server redis-cli // 退出 quit exit // 清除屏幕信息 clear // 获取帮助信息 ...

最新文章

  1. C# 2进制、8进制、10进制、16进制...各种进制间的轻松转换
  2. 干货丨2017年深度学习必读31篇论文(附下载地址)
  3. MVP架构设计 初探
  4. Windows PE导出表编程4(重构导出表实现私有函数导出)
  5. Python+selenium 自动化-基本环境搭建,调用selenium库访问百度查询天气实例演示
  6. .net面试题大全,绝大部分面试题(有答案)
  7. Redis集群监控及Redis桌面客户端
  8. 视频|每日CeBIT:沃森机器人走进生活、三星无线很便利
  9. 罗永浩:因为要烧投资人的钱 所以没有勇气再做手机了
  10. Python版组合数计算方法优化思路和源码
  11. avs3 ts格式封装 标准_第480期【软件】吊打格式工厂—高清视频转换器WonderFox HD Video便携版...
  12. 西电操作系统:进程程序复习
  13. stata:作图——区间阴影,柱状图
  14. fabric 中 peer 和 couch 容器内部数据存放目录地址
  15. TwinCAT3中GetSystemTime()功能块使用
  16. 服务器物理安装,安装Nano Server物理服务器Hyper-V角色
  17. Hibernate基础之SessionFactory
  18. linux查看tomcat 控制台,linux 下查看Tomcat的状态,以及开启停止服务命令
  19. 项目经理需要的基本技能
  20. C++ UML类图关系

热门文章

  1. 递归怎么理解 php,求php一段递归代码的理解
  2. android动态service,Android基础回顾之Service
  3. git常用命令与常见错误
  4. java 命令行 解析_如何在Java中解析命令行参数?
  5. 虚拟服务器 ssl,虚拟主机如何装ssl
  6. mysql fixed数据类型_fixed数据类型
  7. 怎么不能锁门_学校规定宿舍不能锁门,声称方便检查卫生,你认为这合理吗?...
  8. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...
  9. 用计算机实现工业自动化,计算机技术在工业自动化控制系统中的应用
  10. cassss服务未启动_不要再本地启动项目调试了,试SpringBoot远程调试你会发现新大陆!...