Redis(Remote Dictionary Server)入门
说说特性
存储结构:键值对支持多种数据类型,包括字符串类型,散列类型,列表类型,集合类型,有序集合类型。
内存存储与持久化:支持将内存中的数据异步写入磁盘中。
丰富的功能:支持为每个键值对设置生存时间(Time To Live);可以限定内存占用的最大空间,达到最大空间后根据定义的规则自动淘汰不需要的键值对;支持高性能的优先级队列;支持“订阅/发布”的消息模式
多数据库
一个Redis实例提供了多个用来存储数据的字典,客户端可以选择将数据存储在哪个字典中。每个数据库对外都是以一个从0开始的递增数据命名,redis默认支持16个数据库(命名空间)。客户端与redis连接后默认选择0号数据库,不过可以随时使用SELECT命令更换,如SELECT 1;多个数据库并不完成隔离,FLUSHALL可以清除所有数据库中的数据。不同的应用,应该使用不同的Redis实例,而不是同一实例的不同数据库。
命令演示
ping;
select 1;
set bar 1;
get bar; // 当键不存在时返回nil
incr bar; // 当键不存在时默认键值为0,当键值不是整数字符串的时候报错,递增超出范围也会报错。
incrby bar 2;
decr bar;
decrby bar 2;
incrbyfloat key floatvalue; // 能处理增加双精度的操作
append key value; // 尾部追加字符串,返回值为追加后的字符串长度。如果键值不存在相当于set key value;
strlen key; // 返回键值的长度,不存在则返回0
mget key1 key2; // 同时获取多个key值
mset key1 val1 key2 val2; // 同时设置多个key值
getbit key offset;
setbit key offset value;
bitcount key [start] [end]
bitop operation destkey key [key] // 直接对二进制进行操作
keys *;(匹配支持glob风格通配符风格:?匹配一个字符;*匹配任意个字符;[]表示括号间的任一字符;\?用于转义,匹配?)
exists bar;
del bar;
type bar;
/////////////////散列类型/////////////////
hset key field val; // 插入返回1,更新返回0
hget key field;
hmset key field1 val1 field2 val2;
hmget key field [field...];
hgetall key;
hexists key field; // 存在则返回1,否则返回0,键不存在也返回0
hsetnx key field val; // 字段不存在时候赋值
hincrby key field increment;
hdel key field [field...];
hkeys key;
hvals key;
hlen key; // 获得字段数量
/////////////////列表(double linked list)类型/////////////////
lpush key val [val...];
rpush key val [val...];
lpop key;
rpop key;
llen key; // 获取列表中元素个数
lrange key start stop; // 获取列表片段,包含最右边的元素[start, stop]
lrem key count val; // count>0会从列表左边开始删除前count个值为val的元素;count<0会从列表右边开始删除前count个值为val的元素;count=0会删除全部值为val的元素;
lindex key index; // 返回指定索引的元素,索引从0开始,负数则表示从右边开始计算
lset key index val; // 将索引为index的元素赋值为val
ltrim key start end; // 只保留指定片段
linsert key before/after pivot val; // 向列表中插入指定元素,从左到右查找值为pivot的元素,根据before还是after插入
rpoplpush source dest; // 将元素从一个列表转移到另外一个列表
/////////////////集合类型/////////////////
使用值为空的散列表存储,时间复杂度为O(1)。集合之间还可以交并差集运算。
sadd key member [member...]; // 返回成功加入的元素量
srem key member [member...] // 返回成功移除的元素量
smembers key; // 获取集合中的所有元素
sismember key member; // 元素是否在集合中存在,存在则返回1,不存在返回0
sdiff key [key...]; // 差集
sinter key [key...]; // 交集
sunion key [key...]; // 并集
sdiffstore dest key [key...]; // 将差集结果存储到dest中
sinterstore dest key [key...]; // 将交集结果存储到dest中
sunionstore dest key [key...]; // 将并集结果存储到dest中
srandmember key [count]; // 随机获取count个集合元素,当count>0时,选取count个不重复的元素;当count<0时,选取count个有可能重复的元素
spop key; // 随机弹出一个元素
/////////////////有序集合类型/////////////////
和列表的区别:
1、都是有序的,而且可以获得某一范围的元素
2、列表通过链式实现,访问靠近两端的数据速度极快,当元素增多后,访问中间的元素速度会比较慢,比较适合日志,新鲜事这样的很少访问中间元素的应用
3、有序集合使用散列表和跳跃表实现,即使读取中间位置的元素速度也很快O(long(N))
4、列表中不能很方便的调整元素位置,但有序集合可以修改分数很快调整
5、有序集合比列表更耗费内存
zadd key score member [score member...]; // 新增和修改都用此命令+inf和-inf是无穷大和无穷小
zscore key member; // 获取评分
zrange key start stop [withscores]; // 按照分数从小到大选取
zrevrange key start stop [withscores]; // 按照分数从大到小选取
zrangebyscore key min max [withscores] [limit offset count]; // 可以在分数面前加“(”,如(80表示不包含80分的元素
zincrby key increment member; // 增加分数
zcard key; // 获得集合中元素的数量
zcount key min max; // 获得指定范围内的元素个数
zrem key member [member...]; // 删除一个或者多个元素
zremrangebyrank key start stop; // 按照排名范围删除元素
zremrangebyscore key min max; // 按照分数范围删除元素
zrank key member; // 获得元素排名
zinterstore dest numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max]; // 计算有序集合的交集
zunionstore dest numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max]; // 计算有序集合的并集
Redis事务: multi ... exec
导致错误:
1、语法或者参数错误,其他剩余指令不执行
2、运行错误,其他剩余指令还是继续执行
watch命令可以监控一个或多个键值,一旦其中一个键被修改之后事务就不会执行,监控一直持续到exec命令
unwatch可以取消监控
////实现访问频率限制////
1、设置一个字符串类型键,有效时间为1分钟,累加
2、一个队列,记录每次访问时间,一旦队列个数超过访问次数,判断对头和现在的时间差,超过1分钟,则可以反问,插入对尾删除对头,否则不允许访问
expire key seconds; // seconds后自动删除
ttl key; // 查询生存时间,永久存在或者key不存在返回-1
persist key; // 设置永久生存,set和getset命令也会清楚键的生存时间
pexpire key milliseconds; // 设置精度为毫秒
pttl key;
expireat key timestamps;
pexpireat key timestamps;
//////////注意//////////
Redis不区分命令大小,所有命令都是原子操作。
键名命名规则:对象类型:对象ID:对象属性,多个单词则推荐使用“.”分隔。
Redis中每个键值都属于一个明确的数据类型,HSET建立的是散列类型,SET建立的是字符串类型。
生成自增ID:对于每一类对象使用
//////////实现缓存//////////
1、maxmemory
2、maxmemory-policy
volatile-lru 使用LRU算法删除一个键(只对设置了生存周期的键)
allkeys-lru 使用LRU算法删除一个键
volatile-random 随机删除一个键(只对设置了生存周期的键)
allkeys-random 随机删除一个键
volatile-ttl 删除生存周期最近的一个键
noeviction 不删除键,返回错误
/////////////排序//////////////
SORT排序:SORT tag:ruby:posts DESC
BY参数:SORT tag:ruby:posts BY post:*->time DESC; 参考值可以是字符串类型键或者是散列类型键的某个字段,当参考键的->前面不包含*时候不执行排序。
GET参数:SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time GET #; GET #会返回原始本身值
STORE参数: SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time GET # STORE sort.result;报错后的类型为列表类型
优化:
1、尽可能减少待排序的键中的元素数量
2、使用LIMIT参数只获取需要的数据
3、如果排序的数量比较大,尽量使用store参数缓存结果
/////////////实现任务队列//////////////
任务队列由列表实现,BRPOP|BLPOP key 0; // 一直阻塞,阻塞单位为s
优先级的实现BRPOP que1 que2 que3; // 优先级按照队列位置
/////////////发布订阅//////////////
#发布一条消息
PUBLISH channel.1 hi
#按频道名称订阅,取消只取消频道名称,严格匹配,且和通配符订阅无关
SUBSCRIBE channel.1
UNSUBSCRIBE channel.1
#按照规则订阅,取消只取消通配符,和按名称订阅无关
PSUBSCRIBE channel.?*; // PSUBSCRIBE一个客户端可以重复订阅频道,即PSUBSCRIBE channel.1*;PSUBSCRIBE channel.1;PUBLISH channel.1 hello能收到2条消息
PUNSUBSCRIBE channel.1
/////////////节省内存空间//////////////
1、精简键名和键值
2、内部编码优化
/////////////持久化//////////////
1、RDB方式
2、AOF方式(append only file)
/////////////复制//////////////
主数据库(master):可以进行读写操作,当发生写操作时候,自动将数据同步给从数据库
从数据库(slave):默认只读(强制写会报错,设置slave-read-only为no则可写),和接收主数据库同步过来的数据;从数据库配置:slaveof 主数据库ip 主数据库port;slave no one停止作为从数据库转为主数据库
从数据库持久化:持久化比较耗时,可以主数据库取消持久化,从数据库开启持久化;当从数据库宕机后,可以从主数据库同步数据过来;当主数据库宕机后,可以让从数据库执行slave no one,后作为主数据库来运行
/////////////安全//////////////
1、可信环境:Redis的设计是在可信环境前提下做出的,默认配置可以接受来自任何地址发送过来的请求,要更改这一设置,可以在配置文件中修改bind 127.0.0.1(只能绑定一个地址),更复杂的只能通过防火墙来配置。
2、数据库密码:配置文件中设置参数requirepass完成(从数据库需要设置masterauth自动认证)
////////////管理工具redis-cli//////////////
1、耗时命令日志 SLOWLOG GET
当执行一条命令超过限制时,redis会将该命令的相关信息加入耗时命令日志(slow log),可以通过slowlog-log-slower-than参数设置这一限制,单位是微妙,默认值是10 000;设置为0则记录所有,设置为负数则关闭;
2、命令监控MONITOR
任何命令都会在redis-cli中打印,非常影响性能,只用于调试和纠错
Redis(Remote Dictionary Server)入门的更多相关文章
- [CDH] Redis: Remote Dictionary Server
基本概念 一.安装 Redis: Remote Dictionary Server 远程字典服务 使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种 ...
- Redis : REmote DIctionary Server
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵守B ...
- Redis教程(REmote DIctionary Server)——一个高性能的key-value数据库
redis(REmote DIctionary Server)是什么? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...
- redis(Remote Dictionary Server)
redis的简介和使用 简介 redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统,它经常被拿来和Memcached相比 ...
- Redis(REmote DIctionary Server)基础
Redis(REmote DIctionary Server)基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Redis是一个开放源代码(BSD许可)的内存数据结构存储,用作数 ...
- 二:Redis:(REmote DIctionary Server)远程字典服务器
Redis是完全开源免费的,用C语言编写的,遵循BSD协议,是一个高性能的(key-value)分布式内存数据库,基于内存运行,并支持持久化的NOSQL数据库,是当前最热门的NOSQL数据库之一,也被 ...
- redis基础-Remote Dictionary Server
Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念. Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置dat ...
- redis系列--你真的入门了吗?redis4.0入门~
前言 redis作为nosql家族中非常热门的一员,也是被大型互联网公司所青睐,无论你是开发.测试或者运维,学习掌握它总会为你的职业生涯增色添彩. 当然,你或多或少已经了解redis,但是你是否了解其 ...
- .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇
.NET 环境中使用RabbitMQ 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...
随机推荐
- Delphi函数的out、var等关键字的作用,和使用场景
问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解 ...
- 获取字符串中某个指定的子串出现的开始位置(CHARINDEX用法)
CHARINDEX作用 写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,但是SQL SERVER中并没有像C#提供了Contains函数,不过SQL SERVER中提供了一个叫CHAEI ...
- Nginx负载均衡配置与负载策略
原理 负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务. 应用场景 春节期间在12306网站上买过火车票的朋友应该深有体会,有时查询一张火车 ...
- ACM数论之旅13---容斥原理(一切都是命运石之门的选择(=゚ω゚)ノ)
容斥原理我初中就听老师说过了,不知道你们有没有听过(/≧▽≦)/ 百度百科说: 在计数时,必须注意没有重复,没有遗漏. 为了使重叠部分不被重复计算,人们研究出一种新的计数方法. 这种方法的基本思想是: ...
- ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯)
中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 7个7个分剩2个 问这个物品有多少个 解这题,我们需要构造一个答案 我们需要构造这 ...
- 网页正文提取,降噪的实现(readability/Document)
安装: pip install readability-lxml 使用: # encoding:utf-8import html2textimport requestsimport refrom re ...
- 半夜思考,为什么 String 具有不变性
学习 Java 的数据类型时,特殊关照了 String 类型,具有不变性. 当时没有深入思考为什么 String 有不变性.而且我只碰到了 String 才有不变性.Java这样设计的缘由何在. 突然 ...
- 【版本管理】git本地操作
1.初始化一个Git仓库,使用git init命令. 2.添加文件到Git仓库,分两步: • 第一步,使用命令git add 文件名,注意,可反复多次使用,添加多个文件: • 第二步,使用命令git ...
- 【Django】用pycharm初学习使用Django
开发框架流程 M V C(99%的开发都是这种流程.) 1.URL控制器 2.Views 视图 3.models 库 1.首先创建一个Django 2.创建成功后里面几个模块的功能 用它来 ...
- TreeMap源码剖析
原文 http://blog.csdn.net/chdjj/article/details/38782221 主题 源码分析红黑树 注:以下源码基于jdk1.7.0_11 之前介绍了一系列Map集合 ...