【数据库开发】Redis key-value内存数据库介绍

- Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的;
- Redis相比许多键值数据存储系统有相对丰富的数据类型;
- Redis可以将数据复制到任意数量的从服务器中;
Redis优点
异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
- MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;
Redis环境
- $sudo apt-get update
- $sudo apt-get install redis-server
启动 Redis
- $redis-server
查看 redis 是否还在运行
- $redis-cli
- redis 127.0.0.1:6379>
- redis 127.0.0.1:6379> ping
- PONG
Redis数据类型
字符串
示例
- redis 127.0.0.1:6379> SET name "yiibai"
- OK
- redis 127.0.0.1:6379> GET name
- "yiibai"
哈希
示例
- redis 127.0.0.1:6379> HMSET user:1 username yiibai password yiibai points 200
- OK
- redis 127.0.0.1:6379> HGETALL user:1
- 1) "username"
- 2) "yiibai"
- 3) "password"
- 4) "yiibai"
- 5) "points"
- 6) "200"
列表
示例
- redis 127.0.0.1:6379> lpush tutoriallist redis
- (integer) 1
- redis 127.0.0.1:6379> lpush tutoriallist mongodb
- (integer) 2
- redis 127.0.0.1:6379> lpush tutoriallist rabitmq
- (integer) 3
- redis 127.0.0.1:6379> lrange tutoriallist 0 10
- 1) "rabitmq"
- 2) "mongodb"
- 3) "redis"
1 个元素(4294967295,每个列表的元素超过四十亿)。
集合
示例
- redis 127.0.0.1:6379> sadd tutoriallist redis
- (integer) 1
- redis 127.0.0.1:6379> sadd tutoriallist mongodb
- (integer) 1
- redis 127.0.0.1:6379> sadd tutoriallist rabitmq
- (integer) 1
- redis 127.0.0.1:6379> sadd tutoriallist rabitmq
- (integer) 0
- redis 127.0.0.1:6379> smembers tutoriallist
- 1) "rabitmq"
- 2) "mongodb"
- 3) "redis"
1(4294967295,每个集合有超过四十亿条记录)。
集合排序
示例
- redis 127.0.0.1:6379> zadd tutoriallist 0 redis
- (integer) 1
- redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb
- (integer) 1
- redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
- (integer) 1
- redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
- (integer) 0
- redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000
- 1) "redis"
- 2) "mongodb"
- 3) "rabitmq"
Redis键
语法
- redis 127.0.0.1:6379> COMMAND KEY_NAME
示例
- redis 127.0.0.1:6379> SET yiibai redis
- OK
- redis 127.0.0.1:6379> DEL yiibai
- (integer) 1
Redis字符串
语法
- redis 127.0.0.1:6379> COMMAND KEY_NAME
示例
- redis 127.0.0.1:6379> SET yiibai redis
- OK
- redis 127.0.0.1:6379> GET yiibai
- "redis"
Redis哈希
示例
- redis 127.0.0.1:6379> HMSET yiibai name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
- OK
- redis 127.0.0.1:6379> HGETALL yiibai
- 1) "name"
- 2) "redis tutorial"
- 3) "description"
- 4) "redis basic commands for caching"
- 5) "likes"
- 6) "20"
- 7) "visitors"
- 8) "23000"
Redis列表
1 个元素(4294967295,每个列表可有超过四十亿个元素)。
示例
- redis 127.0.0.1:6379> LPUSH tutorials redis
- (integer) 1
- redis 127.0.0.1:6379> LPUSH tutorials mongodb
- (integer) 2
- redis 127.0.0.1:6379> LPUSH tutorials mysql
- (integer) 3
- redis 127.0.0.1:6379> LRANGE tutorials 0 10
- 1) "mysql"
- 2) "mongodb"
- 3) "redis"
Redis集合
1 个元素(4294967295,每个集合中超过四十亿个元素)。
示例
- redis 127.0.0.1:6379> SADD yiibai redis
- (integer) 1
- redis 127.0.0.1:6379> SADD yiibai mongodb
- (integer) 1
- redis 127.0.0.1:6379> SADD yiibai mysql
- (integer) 1
- redis 127.0.0.1:6379> SADD yiibai mysql
- (integer) 0
- redis 127.0.0.1:6379> SMEMBERS yiibai
- 1) "mysql"
- 2) "mongodb"
- 3) "redis"
Redis有序集合
在 Redis 有序集合添加,删除和测试成员的存在的时间复杂度为 O(1)(恒定时间,无论集合内包含元素的数量)。列表的最大长度为 232 -
1 个元素(4294967295,每个集合的元素超过四十亿)。
示例
- redis 127.0.0.1:6379> ZADD yiibai 1 redis
- (integer) 1
- redis 127.0.0.1:6379> ZADD yiibai 2 mongodb
- (integer) 1
- redis 127.0.0.1:6379> ZADD yiibai 3 mysql
- (integer) 1
- redis 127.0.0.1:6379> ZADD yiibai 3 mysql
- (integer) 0
- redis 127.0.0.1:6379> ZADD yiibai 4 mysql
- (integer) 0
- redis 127.0.0.1:6379> ZRANGE yiibai 0 10 WITHSCORES
- 1) "redis"
- 2) "1"
- 3) "mongodb"
- 4) "2"
- 5) "mysql"
- 6) "4"
Redis HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
示例
- redis 127.0.0.1:6379> PFADD tutorials "redis"
- 1) (integer) 1
- redis 127.0.0.1:6379> PFADD tutorials "mongodb"
- 1) (integer) 1
- redis 127.0.0.1:6379> PFADD tutorials "mysql"
- 1) (integer) 1
- redis 127.0.0.1:6379> PFCOUNT tutorials
- (integer) 3
Redis发布订阅
示例
- redis 127.0.0.1:6379> SUBSCRIBE redisChat
- Reading messages... (press Ctrl-C to quit)
- 1) "subscribe"
- 2) "redisChat"
- 3) (integer) 1
- redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
- (integer) 1
- redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by tutorials point"
- (integer) 1
- 1) "message"
- 2) "redisChat"
- 3) "Redis is a great caching technique"
- 1) "message"
- 2) "redisChat"
- 3) "Learn redis by tutorials point"
Redis事务
- 在一个事务中的所有命令作为单个独立的操作顺序执行。在Redis事务中的执行过程中而另一客户机发出的请求,这是不可以的;
- Redis事务是原子的。原子意味着要么所有的命令都执行,要么都不执行;
示例
- redis 127.0.0.1:6379> MULTI
- OK
- List of commands here
- redis 127.0.0.1:6379> EXEC
示例
- redis 127.0.0.1:6379> MULTI
- OK
- redis 127.0.0.1:6379> SET tutorial redis
- QUEUED
- redis 127.0.0.1:6379> GET tutorial
- QUEUED
- redis 127.0.0.1:6379> INCR visitors
- QUEUED
- redis 127.0.0.1:6379> EXEC
- 1) OK
- 2) "redis"
- 3) (integer) 1
Redis脚本
语法
- redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
示例
- redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
- 1) "key1"
- 2) "key2"
- 3) "first"
- 4) "second"
Redis连接
示例
- redis 127.0.0.1:6379> AUTH "password"
- OK
- redis 127.0.0.1:6379> PING
- PONG
Redis备份
语法
- 127.0.0.1:6379> SAVE
示例
- 127.0.0.1:6379> SAVE
- OK
- 127.0.0.1:6379> CONFIG get dir
- 1) "dir"
- 2) "/user/yiibai/redis-2.8.13/src"
Bgsave
示例
- 127.0.0.1:6379> BGSAVE
- Background saving started
Redis安全
示例
- 127.0.0.1:6379> CONFIG get requirepass
- 1) "requirepass"
- 2) ""
- 127.0.0.1:6379> CONFIG set requirepass "yiibaipass"
- OK
- 127.0.0.1:6379> CONFIG get requirepass
- 1) "requirepass"
- 2) "yiibaipass"
语法
- 127.0.0.1:6379> AUTH password
Redis性能测试
语法
- redis-benchmark [option] [option value]
示例
- redis-benchmark -n 100000
- PING_INLINE: 141043.72 requests per second
- PING_BULK: 142857.14 requests per second
- SET: 141442.72 requests per second
- GET: 145348.83 requests per second
- INCR: 137362.64 requests per second
- LPUSH: 145348.83 requests per second
- LPOP: 146198.83 requests per second
- SADD: 146198.83 requests per second
- SPOP: 149253.73 requests per second
- LPUSH (needed to benchmark LRANGE): 148588.42 requests per second
- LRANGE_100 (first 100 elements): 58411.21 requests per second
- LRANGE_300 (first 300 elements): 21195.42 requests per second
- LRANGE_500 (first 450 elements): 14539.11 requests per second
- LRANGE_600 (first 600 elements): 10504.20 requests per second
- MSET (10 keys): 93283.58 requests per second
Redis客户端连接
- 客户端套接字在非阻塞状态,因为 Redis 使用复用和非阻塞I/O;
- TCP_NODELAY选项设定以确保不会在连接时延迟;
- 创建一个可读的文件事件,以便 Redis 能够尽快收集客户端查询作为新的数据可被套接字读取;
- config get maxclients
- 1) "maxclients"
- 2) "10000"
示例
- redis-server --maxclients 100000
Redis管道
- 客户端发送一个查询给服务器,并从套接字中读取,通常服务器的响应是在一个封闭的方式;
- 服务器处理命令并将响应返回给客户端;
示例
- $(echo -en "PING\r\n SET tutorial redis\r\nGET tutorial\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
- +PONG
- +OK
- redis
- :1
- :2
- :3
Redis分区
分区的好处
- 它允许更大的数据库,使用多台计算机的内存总和。如果不分区,只是一台计算机有限的内存可以支持的数据存储;
- 它允许按比例在多内核和多个计算机计算,以及网络带宽向多台计算机和网络适配器;
- 涉及多个键的操作通常不支持。例如,如果它们被存储在被映射到不同的 Redis 实例键,则不能在两个集合之间执行交集;
- 涉及多个键时,Redis事务无法使用;
- 分区粒度是一个键,所以它不可能使用一个键和一个非常大的有序集合分享一个数据集;
- 当使用分区,数据处理比较复杂,比如要处理多个RDB/AOF文件,使数据备份需要从多个实例和主机聚集持久性文件;
- 添加和删除的容量可能会很复杂。例如:Redis的Cluster支持数据在运行时添加和删除节点是透明平衡的,但其他系统,如客户端的分区和代理服务器不支持此功能
分区类型
【数据库开发】Redis key-value内存数据库介绍的更多相关文章
- 【数据库开发】学习Redis从这里开始
转载:http://www.epubit.com.cn/article/200 学习Redis从这里开始 本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例 ...
- Redis数据库?-Redis的Virtual Memory介绍(转)
众所周知,Redis是一个内存数据库,和Memcached类似,所有数据存在内存中,当然,Redis有rdb和appendonlyfile两个落地文件,可以对断电停机等故障下的数据恢复做一些保证.但是 ...
- 第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍
第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structur ...
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- .net core的配置介绍(二):自定义配置(Zookeeper,数据库,Redis)
上一篇介绍了.net core的配置原理已经系统提供的一些常用的配置,但有时我们的配置是存放在Zookeeper,DB,Redis中的,这就需要我们自己去实现集成了. 这里再介绍几个我们用的多的配置集 ...
- Redis中的批量删除数据库中的Key
本文参考:http://blog.csdn.net/spring21st/article/details/15771861 http://stackoverflow.com/questions/575 ...
- 批量删除Redis数据库中的Key
批量删除KeyRedis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作 redis-cli keys &q ...
- Redis数据库入门基础,及优缺点介绍
简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-value数据库.R ...
- 如何批量删除Redis数据库中的Key
借助 Linux 的 xargs 指令来完成 redis-cli keys "*" | xargs redis-cli del //如果redis-cli没有设置成系统变量,需要指 ...
- FusionInsight大数据开发---Redis应用开发
Redis应用开发 要求: 了解Redis应用场景 掌握Redis二次开发环境搭建 掌握Redis业务开发 Redis简介 Redis是一个基于网络的,高性能key-value内存数据库 Redis根 ...
随机推荐
- 011_GoldWave软件安装及使用
(一)软件安装包: 链接:https://pan.baidu.com/s/15c5veooyA8bAYIAgLFOLjg提取码:jiis 复制这段内容后打开百度网盘手机App,操作更方便哦 (二)降低 ...
- 学习了武沛齐讲的Day10-完
int 整形 int 将字符串转换为数字 x.bit_length() ===== 当前数字的二进制,至少用n位表示 str 字符串 x.capitalize()== ...
- 一些VMware vCenter Appliance的默认用户名和密码
一些VMware vCenter Appliance的默认用户名和密码 2014-03-30 17:30:03 flowershade_21 阅读数 13367更多 分类专栏: vmware VM ...
- bzoj 4319: cerc2008 Suffix reconstruction 贪心
如果字符集无限大的话直接按照 $sa$ 的顺序依次填即可. 由于字符集非常小,所以要尽量填相同的字符. 我们知道 $sa$ 数组,也就知道了 $rank$ 数组. 那么考虑添加排名为 $i$ 的字符: ...
- Android Handler消息处理顺序分析
看到Handler中的消息处理函数: public void dispatchMessage(Message msg){...} 这个函数是在Looper的执行消息循环loop()的时候取出Messa ...
- android studio3.4打jar包
第一步在build.gradle文件里的android{}里面加入下面内容 //生成jar包 task makeJar(type:Copy) { delete 'build/outputs/netwo ...
- Go By Example-值类型
Go By Example-值类型 Go语言的数据类型可以分为值类型和引用类型,这里先说值类型. 值类型 值类型:在Go语言中int.float.bool和string这些类型都属于值类型,使用这些类 ...
- 7个最好的Java机器学习开发库
摘要:现如今,拥有深度学习和机器学习领域的技术是科技界的趋势之一,并且企业则希望雇佣一些拥有良好的机器学习知识背景的程序开发工程师.本文将介绍一些目前流行的.强大的基于Java的机器学习库,希望给大家 ...
- 42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址
CheckOut.dart import 'package:flutter/material.dart'; import '../services/ScreenAdapter.dart'; impor ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_10-课程详情页面静态化-课程详情模型数据查询接口
根据课程详情页面写一个获取数据模型的接口 目录的数据来自于课程计划表 右侧是课程的图片 需要写一个接口 获取课程相关的所有信息. 所以就需要一个模型类,里面包含了基本信息.图片信息.等各种详情页面的信 ...