Redis

本文介绍了NoSql数据库的概念及其分类,并详细解析了Redis的发展历程、特点、应用场景及安装配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis介绍

什么是NoSql

为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。

NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。

Nosql数据库分类

 键值(Key-Value)存储数据库

  • 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
  • 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
  • 数据模型: 一系列键值对
  • 优势: 快速查询
  • 劣势: 存储的数据缺少结构化

列存储数据库

  • 相关产品:Cassandra, HBase, Riak
  • 典型应用:分布式的文件系统
  • 数据模型:以列簇式存储,将同一列数据存在一起
  • 优势:查找速度快,可扩展性强,更容易进行分布式扩展
  •  劣势:功能相对局限

文档型数据库

  • 相关产品:CouchDB、MongoDB
  • 典型应用:Web应用(与Key-Value类似,Value是结构化的)
  • 数据模型: 一系列键值对
  •  优势:数据结构要求不严格
  •  劣势: 查询性能不高,而且缺乏统一的查询语法

图形(Graph)数据库

  • 相关数据库:Neo4J、InfoGrid、Infinite Graph
  • 典型应用:社交网络
  • 数据模型:图结构
  • 优势:利用图结构相关算法。
  • 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

什么是Redis 

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:

  • 字符串类型
  • 散列类型
  • 列表类型
  • 集合类型
  • 有序集合类型

redis历史发展 

       2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。

         Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。

         VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

redis的应用场景

  1. 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用
  2. 分布式集群架构中的session分离。
  3. 聊天室的在线好友列表。
  4. 任务队列。(秒杀、抢购、12306等等)
  5. 应用排行榜。
  6. 网站访问统计。
  7. 数据过期处理(可以精确到毫秒)

Redis安装配置

Redis下载 

官网地址:http://redis.io/

下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz

Redis安装

Redis是C语言开发、安装Redis,需要先下载它的源码,然后对源码进行编译,并且编译源码需要gcc环境、如果没有gcc环境、需要先安装gcc.

步骤如下:

1. 安装gcc 编译环境

    yum  install   gcc-c++

2. 解压 redis-3.0.7.tar.gz 到 /usr/local

    tar -zxvf  redis-3.0.7.tar.gz /usr/local

3. 进入解压好的redis-3.0.7 目录中,编译

    make

4. 编译好之后,执行以下命令安装:

    make PREFIXE=/usr/local/redis install 

5. 拷贝 redis-3.0.7中的 redis.conf 到 redis文件夹中。 不过最好建议是拷贝到bin目录中 

    cp redis.conf /usr/local/redis/bin

6. 进入 redis/bin目录中,启动redis

    ./redis-server redis.conf

    但是这么启动,默认启动的是前端模式。我们需要切换到后端模式启动。

7. vi redis.conf

    修改里面的一个属性值。

    daemonize =yse

8. 测试是否启动成功。

    ps -ef|grep redis

    或者启动客户端来与服务器连接,测试看看。

    ./redis-cli

9 后端启动的关闭方式

非正常关闭(不推荐使用):

 kill 5528

正常关闭:

 ./redis-cli shutdown

Redis自带的客户端 

 指定主机和端口

./redis-cli -h 127.0.0.1 -p 6379

-h:redis服务器的ip地址

-p:redis实例的端口号

如果不指定主机和端口也可以

[root@localhost-0723 bin]# ./redis-cli

默认主机地址是127.0.0.1

默认端口是6379

图形界面客户端

211611_aOyE_3669094.png

连接超时解决

远程连接redis服务,需要关闭或者修改防火墙配置。

第一步:编辑iptables

 vim /etc/sysconfig/iptables

211740_VGuz_3669094.png

在命令模式下,选定要复制的那一行的末尾,然后点击键盘yyp,就完成复制,然后修改

第二步:重启防火墙

[root@localhost-0723 redis-3.0.0]# service iptables restart

iptables:清除防火墙规则:                                 [确定]

iptables:将链设置为政策 ACCEPT:filter                    [确定]

iptables:正在卸载模块:                                   [确定]

iptables:应用防火墙规则:                                 [确定]

[root@localhost-0723 redis-3.0.0]#

 

注意:

默认一共是16个数据库,每个数据库之间是相互隔离。数据库的数量是在redis.conf中配置的。

切换数据库使用命令:select 数据库编号

例如:select 1

Java客户端Jedis

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。

         在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。

Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

jar包

212720_bgfP_3669094.png

//单实例连接	
    @Test
	public void testJedis() {
		//创建一个Jedis的连接
		Jedis jedis = new Jedis("127.0.0.1", 6379);
		//执行redis命令
		jedis.set("mytest", "hello world, this is jedis client!");
		//从redis中取值
		String result = jedis.get("mytest");
		//打印结果
		System.out.println(result);
		//关闭连接
		jedis.close();
		
	}
//连接池连接
    @Test
	public void testJedisPool() {
		//创建一连接池对象
		JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
		//从连接池中获得连接
		Jedis jedis = jedisPool.getResource();
		String result = jedis.get("mytest");
		System.out.println(result);
		//关闭连接
		jedis.close();
		
		//关闭连接池
		jedisPool.close();
	}

Spring整合jedisPool

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 连接池配置 -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<!-- 最大连接数 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空闲连接数 -->
		<property name="maxIdle" value="10" />
		<!-- 每次释放连接的最大数目 -->
		<property name="numTestsPerEvictionRun" value="1024" />
		<!-- 释放连接的扫描间隔(毫秒) -->
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<!-- 连接最小空闲时间 -->
		<property name="minEvictableIdleTimeMillis" value="1800000" />
		<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
		<property name="softMinEvictableIdleTimeMillis" value="10000" />
		<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
		<property name="maxWaitMillis" value="1500" />
		<!-- 在获取连接的时候检查有效性, 默认false -->
		<property name="testOnBorrow" value="false" />
		<!-- 在空闲时检查有效性, 默认false -->
		<property name="testWhileIdle" value="true" />
		<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
		<property name="blockWhenExhausted" value="false" />
	</bean>

	<!-- redis单机 通过连接池 -->
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
		destroy-method="close">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
		<constructor-arg name="host" value="192.168.242.130" />
		<constructor-arg name="port" value="6379" />
	</bean>
</beans>
@Test
	public void testJedisPool() {
		JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
		Jedis jedis = null;
		try {
			jedis = pool.getResource();

			jedis.set("name", "lisi");
			String name = jedis.get("name");
			System.out.println(name);
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (jedis != null) {
				// 关闭连接
				jedis.close();
			}
		}
	}

 

转载于:https://my.oschina.net/px828261/blog/1551580

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值