Redis 小结

一、redis简介

  redis是一款基于C语言编写的,开源的非关系型数据库,由于其卓越的数据处理机制(按照规则,将常用的部分数据放置缓存,其余数据序列化到硬盘),大家也通常将其当做缓存服务器来使用。

  在很多时候,大家还认为其只是一个key-value数据库服务器。然而redis还支持多种数据类型的存储,应用范围也更加广泛

  redis支持的数据类型有string字符串。list列表,hash哈希,set集合,及zset(sorted set:有序集合)。

  redis支持数据持久化(每隔一段时间会将内存中的数据写入粗盘;如果机器故障重启,还可以将硬盘的数据反写会内存),保证了告诉处理数据操作的同事,增加了数据的安全性;同时也支持数据数据库的主从复制、发布订阅、事务支持、管道和虚拟内存

 

二、redis优势

和其他nosql相比,redis的性能会更加卓越;同时,支持排名集合计算,消息队列等操作。

三、redis和memcached的区别

  1、两者都是内存数据库,效率方面差别不大

  2、redis不仅仅支持key-value数据格式,还支持list、set、hash等数据结构的存储

  3、memcached是基于内存的key-value缓存服务器,完全基于内存,如果不考虑异常关机造成数据丢失的情况下,可以考虑;但是redis可以做数据持久化,因而数据安全性方面没有redis做的好

  4、redis可以做故障恢复,将数据从硬盘恢复到内存

  5、redis支持数据备份,即主从备份

四、redis的安装

五、redis数据类型

  1、string字符串

    string是redis最基本的数据类型,存取方便,可以存储一切可以序列化的数据对象,取出后可以反序列化为存储之前的数据对象进行使用

    在实际操作中,通过set存储,get获取;name即为key值,liming为存储对象

    注意:value存储最大数据为512M

    使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。

    

127.0.0.1:6379> set name liming
OK
127.0.0.1:6379> get name
"liming"

  

  2、list列表

    list是数据列表格式,按照顺序插入数据,也可以插入数据到列表的头部或者尾部在实际操作中是通过lpust来存储数据列表。lrange来获取数据列表,取出一个值后,则在当前队列中消失

    基本语法:存储lpush  key value 例如(127.0.0.1:6379> lpush list C#);获取lrange key 查询索引开始  查询索引结束,例如(127.0.0.1:6379> lrange list 0 2)

    列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

    Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。

    应用场景:list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。

127.0.0.1:6379> lpush list redis
(integer) 1
127.0.0.1:6379> lpush list rabbitMQ
(integer) 2
127.0.0.1:6379> lpush list sql
(integer) 3
127.0.0.1:6379> lpush list C#
(integer) 4
127.0.0.1:6379> lpush list python
(integer) 5
127.0.0.1:6379> lpush list java
(integer) 6
127.0.0.1:6379> lrange 0 2
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list 0 2
1) "java"
2) "python"
3) "C#"

  

  3、hash哈希

    hash 是一种key-value 键值对集合,类似数据字典,通过hmset 来存储,hget来获取

    语法:hmset 哈希名称   key1 value1   key2 value2 ……   例如(127.0.0.1:6379> hmset myhash name1 'licy' name2 'lili' name3 'hanmeimei')

    每个 hash 可以存储 232 -1 键值对(40多亿)。

    使用场景:存储部分变更数据,如用户信息等。

127.0.0.1:6379> hmset myhash name1 'licy' name2 'lili' name3 'hanmeimei'
OK
127.0.0.1:6379> hget myhash1 name1
(nil)
127.0.0.1:6379> hget myhash  name1
"licy"
127.0.0.1:6379> 

  

  4、set集合

    set集合是一种无序的数据集合,添加用 sadd,获取用smembers,添加成功则返回1,已经存在则返回0,添加失败则返回错误信息

    语法:存储  sadd 集合名称  数据值(例如:127.0.0.1:6379> sadd myset redis) ;获取smembers 集合名称(例如:127.0.0.1:6379> smembers myset)

    注:集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    应用场景:求交集;求差集;求并集;获取某时间段内的数据去重

127.0.0.1:6379> sadd myset redis
(integer) 1
127.0.0.1:6379> sadd myset C#
(integer) 1
127.0.0.1:6379> sadd myset java
(integer) 1
127.0.0.1:6379> sadd myset python
(integer) 1
127.0.0.1:6379> smembers myset
1) "java"
2) "C#"
3) "redis"
4) "python"

  

  5、zset有序集合

    zset是一种有序集合,和string类似,多了个增加分数,获取时会按照分数小到大进行数据返回

    key值是唯一的,但是分数可以重复

    语法:存储  zadd 集合名词  分数  数据值 (例如:127.0.0.1:6379> zadd myzset2  3 sql);获取 ZRANGEBYSCORE 集合名称  索引开始  索引结束(例如:127.0.0.1:6379> ZRANGEBYSCORE myzset2 0 10)

    应用场景:显示最新的列表数据项目;排行榜应用获取top N操作;求交集;求差集;求并集;获取某时间段内的数据去重

127.0.0.1:6379> zadd myzset2  3 sql
(integer) 1
127.0.0.1:6379> zadd myzset2  1 C#
(integer) 1
127.0.0.1:6379> zadd myzset2  2 python
(integer) 1
127.0.0.1:6379> zadd myzset2  0 redis
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE myzset2 0 10
1) "redis"
2) "C#"
3) "python"
4) "sql"
127.0.0.1:6379> 

  

六、redis功能

  1、发布订阅

    redis的发布订阅是一种消息通讯模式,发布者发送消息,接收这接受消息,客户端可以任意定义频道,redis客户端可以任意订阅频道

    

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

pubsub1

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

pubsub2

实例:订阅者

127.0.0.1:6379> SUBSCRIBE fabu1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "fabu1"
3) (integer) 1
1) "message"
2) "fabu1"
3) "my fa bu "

  发布者

127.0.0.1:6379> PUBLISH fabu1 'my fa bu '
(integer) 1
127.0.0.1:6379> 

  2、持久化

  由于redis的数据是存放在内存中,如果没有持久化,redis重启或者服务器重启数据会丢失,于是需要开启redis的持久化功能,用于将数据保存在硬盘上,当redis重启后,可以从硬盘中恢复数据。

  redis提供两种方式进行持久化,一种是RDB持久化(原理是将redis中在内存中的数据记录定时dump到硬盘上的RDB持久化),另一种是AOD持久化(原理是将redis的操作日志以追加的方式写入文件)

  3、redis的主从复制

  一般来说,一台redis可以处理的数据是有限的,即使硬件支持很好,也无法满足日益增长的业务需求,因而redis提供了主从集群的功能,可以实现读写分离,极大限度的提高了系统的性能和满足业务的拓展。同时,为了避免一台redis服务器宕机而引起的系统崩溃,redis也提供了启用sentinel(哨兵)服务,在一台服务器宕机是自动切换到另外一台从服务器,同时设置当前的从服务器为主服务器

  4、redis事务

  在系统中,经常会遇到很多零散的操作有很强的顺序性,一旦中间某个操作异常或者服务器异常等其他情况,因而就需要事务来处理

  redis事务可以一次执行多个命令,redis会将事务中的命令序列化,然后按照顺序执行。redis事务不可能在事务执行的过程中插入另外一个客户端发来的命令请求,这样便保证了命令执行的过程中进行隔离单独执行。在redis事务中,要么执行所有命令要么一个都不执行

  一个事务从开始到执行共有三个阶段

    a、事务开始

    b、命令入列

    c、执行事务

  5、redis管道

  6、redis虚拟内存

七、redis总结

redis是高性能的缓存服务器解决方案,可以数据持久化和快速搭建集群,高并发,高可用性

参考地址http://www.cnblogs.com/caokai520/p/4409712.html

转载于:https://www.cnblogs.com/happygx/p/8411134.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetBeans Java EE技巧#1 –数据库中的实体类

NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说,我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中,不仅Java EE的生产力提高了,而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBeans成为绝配&#x…

asp mysql添加数据_ASP:ado.net 实例向数据库添加数据。

我在这使用的是老师给的数据库1,web窗体设计。设计添加图书窗体,窗体属性有图书种类(下拉列表框控件),图书名称,作者,编号,出版社,价格均为文本框,日期(第三方日期控件),…

spring jmx_JMX和Spring –第1部分

spring jmx这是三篇文章的第一篇&#xff0c;这三篇文章将展示如何通过JMX支持为Spring应用程序赋能。 Maven配置 这是用于设置此示例代码的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

守口住嘴

守口 祸从口出 病从口入 住嘴 嘴能成事 亦能坏事 守口 祸从口出 病从口入 住嘴 嘴能成事 亦能坏事 转载于:https://www.cnblogs.com/fangtengfei/p/8416073.html

JAVA有percentile函数吗_Python numpy.percentile函数方法的使用

numpy.percentilenumpy.percentile(a, q, axisNone, outNone, overwrite_inputFalse, interpolationlinear, keepdimsFalse) [source]计算沿指定轴的数据的第q个百分位数。返回数组元素的第q个百分点。参数 &#xff1a;a &#xff1a;array_like输入数组或可以转换为数组的…

C代码的运行速度总是比Java快,对吧? 错误!

因此&#xff0c;我们都知道&#xff0c;Java解释缓慢且C的编译和优化运行速度非常快。 您可能知道&#xff0c;图片截然不同。 TL; DR Java适用于星座&#xff0c;它的速度更快&#xff0c;在JIT上可以执行内联&#xff0c;因为所有方法/功能都是可见的&#xff0c;而C编译器…

JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)

运用JS的innerHTML&#xff0c;和for循环实现日历小部件内容和日期的转换。 <!DOCTYPE html> <html> <head><title>日历小部件</title><style type"text/css">*{padding: 0;margin:0;}.tab{width:220px;background: #ccc;height…

Django-认证系统

知识预览 COOKIE 与 SESSION用户认证 回到顶部COOKIE 与 SESSION 概念 cookie不属于http协议范围&#xff0c;由于http协议无法保持状态&#xff0c;但实际情况&#xff0c;我们却又需要“保持状态”&#xff0c;因此cookie就是在这样一个场景下诞生。 cookie的工作原理是&…

jpa 查询 列表_终极JPA查询和技巧列表–第3部分

jpa 查询 列表在阅读第三部分之前&#xff0c;请记住本系列的第一部分和第二部分 JPA&#xff1a;通过查询创建对象 JPA允许我们使用所需的值在查询内创建对象&#xff1a; package com.model;public class PersonDogAmountReport {private int dogAmount;private Person per…

java 限制文件大小_java上传文件大小限制

win系统下解决ASP上传文件大小限制200K_电脑基础知识_IT/计算机_专业资料。win系统下解决ASP上传文件大小限制200K 解决ASP 上传文件大小限制 200K win2003 系统下的 ......介绍 上传 // 新建一个 SmartUpload 对象 SmartUpload su new SmartUpload(); // 上传初始化 su.initi…

java 数组的get set_java.lang.reflect.Array.setBoolean()方法

java.lang.reflect.Array.setBoolean(Object array, int index, boolean value)方法将指定的数组对象的索引组件的值设置为指定的布尔值。声明以下是java.lang.reflect.Array.set(Object array, int index, boolean value)方法的声明。public static void setBoolean(Object ar…

poj3984 迷宫问题 bfs 最短路 广搜

迷宫问题Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 27913 Accepted: 16091Description定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫&#xff0c;其中的1表示墙壁…

使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xff0c;该应用程序用…

python之字符串连接

join 就属于技巧了&#xff0c;利用字符串的函数 join 。这个函数接受一个列表&#xff0c;然后用字符串依次连接列表中每一个元素&#xff1a; str_list [Pyt, hon] a print a.join(str_list)步骤&#xff1a; 1、建立一个列表 2、利用 join() 原文链接  转载于:https://…

JAVA取钱多线程实验_JAVA多线程----用--取钱问题2

在该示例代码中&#xff0c;TestAccount类是测试类&#xff0c;主要实现创建帐户Account类的对象&#xff0c;以及启动学生线程StudentThread和启动家长线程GenearchThread。在StudentThread线程中&#xff0c;执行的功能是每隔2秒中取一次钱&#xff0c;每次取50元。在Genearc…

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c&#xff0c;按大小顺序输出的实例讲解题目&#xff1a;输入3个数a,b,c&#xff0c;按大小顺序输出。代码&#xff1a;import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…

Java 8中HotSpot选项的改进文档

Oracle的 Java 8 的HotSpot实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 &#xff08; java &#xff09;选项/标志。 过去&#xff0c;即使是对某些相当常见的HotSpot JVM选项也感兴趣的开发人员 &#xff0c;不得不潜在地寻找…

sql server数据库课程设计分析

课题&#xff1a;能源管理收费系统 系统功能的基本要求&#xff1a; &#xff08;1&#xff09;用户基本信息的录入&#xff1a;包括用户的单位、部门、姓名、联系电话、住址 &#xff1b; &#xff08;2&#xff09;用户水、电、气数据的录入&#xff08;每个月的数据的录入&a…

Springboot 项目启动后执行某些自定义代码

Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种“开机启动”某些方法的方式&#xff1a;ApplicationRunner和CommandLineRunner。这两种方法提供的目的是为了满足&#xff0c;在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和Com…