您的位置:首页 > 数据库 > Redis

redis学习笔记

2016-03-09 10:45 363 查看
Redis
1、什么是redis

a) 什么是nosql

b) Nosql的数据库的种类

c) Redis是什么类型

d) Redis的应用场景

2、Redis的安装

a) 安装环境

b) 安装步骤

c) 启动停止

3、Redis的数据类型

a) String

b) Hash

c) Set

d) List

e) SortedSet(zset)

4、Redis的持久化

5、Redis的主从复制

6、Redis的集群

7、Redis的java客户端Jedis

2 Redis的相关概念

Redis是一个key-value形式的nosql数据库。

2.1 什么是nosql

关系型数据库:mysql、Oracle、SQLServer、DB2

Nosql:非关系型数据库。

主要是解决互联网项目中的高并发、大数据的问题。

NoSQL数据库的四大分类如下:

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

相关产品: TokyoCabinet/Tyrant、Redis、Voldemort、Berkeley DB

典型应用: 内容缓存,主要用于处理大量数据的高访问负载。

数据模型: 一系列键值对

优势: 快速查询

劣势: 存储的数据缺少结构化

n 列存储数据库

相关产品:Cassandra,HBase, Riak

典型应用:分布式的文件系统

数据模型:以列簇式存储,将同一列数据存在一起

优势:查找速度快,可扩展性强,更容易进行分布式扩展

劣势:功能相对局限

n 文档型数据库

相关产品:CouchDB、MongoDB

典型应用:Web应用(与Key-Value类似,Value是结构化的)

数据模型: 一系列键值对

优势:数据结构要求不严格

劣势: 查询性能不高,而且缺乏统一的查询语法

n 图形(Graph)数据库

相关数据库:Neo4J、InfoGrid、Infinite Graph

典型应用:社交网络

数据模型:图结构

优势:利用图结构相关算法。

劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

2.2 Redis的应用场景

缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)

分布式集群架构中的session分离。

聊天室的在线好友列表。

任务队列。(秒杀、抢购、12306等等)

应用排行榜。

网站访问统计。

数据过期处理(可以精确到毫秒)

主要是解决高并发问题,互联网项目中会用到。

3 Redis的安装

3.1 Redis的安装环境

操作系统:CentOS6.432位

Redis是c语言开发的。需要gcc环境来编译。

Redis版本:3.0.0

3.2 Vmware的网络配置

1、虚拟机选择nat 模式

2、配置虚拟机

3、重启网络服务

[itcast@localhost Desktop]$ service networkrestart

安装gcc:

yum install gcc-c++

3.3 Redis的安装步骤

第一步:把redis的源码包上传到linux系统。

第二步:解压缩源码包。

[root@localhost ~]# tar -zxvf redis-3.0.0.tar.gz

第三步:make

第四步:makeinstall PREFIX=/usr/local/redis

3.4 Redis的启动及停止

3.4.1 启动redis

1、前端启动

进入:/usr/local/redis/bin目录,启动redis-server命令。

[root@localhost bin]# ./redis-server

2、后台启动

需要启动时指定配置文件,在配置文件中指定后台启动。

从redis的源码包中把redis.conf文件复制到安装目录。

修改:

[root@localhost bin]# ./redis-serverredis.conf

查看进程:

[root@localhost bin]# ps aux|grep redis

3.4.2 关闭redis

使用kill命令:

[root@localhost bin]# kill 5970

正常关闭:

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

4 Redis的常用命令

4.1 ping

使用redis的客户端连接redis服务。

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

[root@localhost bin]# ./redis-cli -p 6379-h 192.168.25.153

-p:指定端口号

-h:会自动服务的ip地址

4.2 Redis的数据类型

五种数据类型:

String

Hash

List

Set

SortedSet

在redis中保存的所有的数据都是字符串。

4.2.1 String

Set、get命令:

192.168.25.153:6379> set key1 100

OK

192.168.25.153:6379> get key1

"100"

192.168.25.153:6379>

列出数据库中所有的key:

192.168.25.153:6379> keys *

1) "key1"

删除key:

192.168.25.153:6379> del key1

(integer) 1

自增、自减命令:

192.168.25.153:6379> get hello

"123"

192.168.25.153:6379> incr hello

(integer) 124

192.168.25.153:6379> decr hello

(integer) 123

192.168.25.153:6379>

注意

Redis是单线程的,不用担心多线程问题。Redis把所以数据都保存到内存中。Redis中保存的数据不能太大。

如果突然断电redis可能会丢失数据。

4.2.2 Hash类型

相当于一个key对应一个map

Key——Map

|-key-value

|-key-value

|-key-value

|-key-value

|-key-value

创建hash:

添加、查询key

192.168.25.153:6379> hset hash1 key1 a

(integer) 1

192.168.25.153:6379> hget hash1 key1

"a"

向hash中添加多个key:

192.168.25.153:6379> hmset hash1 key2 bkey3 c key4 d

OK

192.168.25.153:6379> hget hash1 key3

"c"

192.168.25.153:6379> hmget hash1 key1key2 key3 key4

1) "a"

2) "b"

3) "c"

4) "d"

查看hash中的数据:

192.168.25.153:6379> hkeys hash1

1) "key1"

2) "key2"

3) "key3"

4) "key4"

192.168.25.153:6379> hvals hash1

1) "a"

2) "b"

3) "c"

4) "d"

192.168.25.153:6379> hgetall hash1

1) "key1"

2) "a"

3) "key2"

4) "b"

5) "key3"

6) "c"

7) "key4"

8) "d"

192.168.25.153:6379>

4.2.3 List类型

列表中数据是可以重复的。

向列表中添加节点:

Lpush、rpush

192.168.25.153:6379> lpush list1 a b c de f

(integer) 6

192.168.25.153:6379> rpush list1 1 2 3 45 6

(integer) 12

展示列表中的元素:

Lrange <start> <end>

如果end为-1取所有元素

192.168.25.153:6379> lrange list1 0 -1

1)"f"

2)"e"

3)"d"

4)"c"

5)"b"

6)"a"

7)"1"

8)"2"

9)"3"

10) "4"

11) "5"

12) "6"

192.168.25.153:6379>

查看列表长度:

192.168.25.153:6379> llen list1

(integer) 12

取列表中的数据:

192.168.25.153:6379> lpop list1

"f"

192.168.25.153:6379> rpop list1

"6"

192.168.25.153:6379> lrange list1 0 -1

1)"e"

2)"d"

3)"c"

4)"b"

5)"a"

6)"1"

7)"2"

8)"3"

9)"4"

10) "5"

4.2.4 Set类型

集合类型中不可以有重复的元素。而且元素是无序的。

向set中添加元素:

192.168.25.153:6379> sadd set1 a b c a bc

(integer) 3

查看set中的元素:

192.168.25.153:6379> smembers set1

1) "a"

2) "c"

3) "b"

删除set中的元素:

192.168.25.153:6379> srem set1 a

(integer) 1

192.168.25.153:6379> smembers set1

1) "c"

2) "b"

集合运算:

差集:

sdiff

192.168.25.153:6379> sadd seta a b c d ef

(integer) 6

192.168.25.153:6379> sadd setb d e f g h

(integer) 5

192.168.25.153:6379> sdiff seta setb

1) "a"

2) "b"

3) "c"

交集:

sinter

192.168.25.153:6379> sinter seta setb

1) "d"

2) "e"

3) "f"

并集:

Sunion

192.168.25.153:6379> sunion seta setb

1) "d"

2) "e"

3) "f"

4) "c"

5) "g"

6) "a"

7) "h"

8) "b"

4.2.5 SortedSet

有序的集合:元素不能重复且有顺序。

每个元素都有一个分值,根据分值排序。

向集合中添加元素:

192.168.25.153:6379> zadd zset1 1 a 2 b5 c 3 d

(integer) 4

zadd <集合名称> [<分数> <元素名称>]

查看集合中的元素:

192.168.25.153:6379> zrange zset1 0 -1

1) "a"

2) "b"

3) "d"

4) "c"

查看元素带分数:

192.168.25.153:6379> zrange zset1 0 -1 withscores

1) "a"

2) "1"

3) "b"

4) "2"

5) "d"

6) "3"

7) "c"

8) "5"

倒序:

192.168.25.153:6379> zrevrange zset1 0-1

1) "c"

2) "d"

3) "b"

4) "a"

192.168.25.153:6379> zrevrange zset1 0-1 withscores

1) "c"

2) "5"

3) "d"

4) "3"

5) "b"

6) "2"

7) "a"

8) "1"

192.168.25.153:6379>

4.3 设置key的过期时间

使用expire命令,设置key的过期时间:

192.168.25.153:6379> expire hello 100

(integer) 1

192.168.25.153:6379> ttl hello

(integer) 91

192.168.25.153:6379> persist hello

(integer) 1

192.168.25.153:6379> ttl hello

(integer) -1

4.4 Redis的多个数据库

单机版的redis默认有16个数据库,默认使用的是0号数据库。

可以使用select命令切换数据库。

flushdb

清空当前数据库。

flushall

清空所有数据库中的数据(慎用)。

5 Redis的持久化

Redis的持久化有两种方式rdb、aof形式。

5.1 Rdb

快照形式。

定期向磁盘保存快照,redis默认的持久化方案。

配置持久化方案,需要修改redis.conf文件。

5.2 Aof

默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

appendonly yes

把对数据库进行修改的命令保存到aof文件中。

两种方案可以同时开启。

默认每秒向aof文件中保存一次命令,数据的完整性比rdb形式高。性能比rdb形式差。

两种持久化方案同时开启,默认使用aof来恢复数据。

6 Redis的主从复制

配置方法:

主服务器和从服务器。

可以在一台服务器上启动两个redis实例来模拟。

第一步:需要修改端口号。

第二步:主服务器的配置。不需要任何配置

第三步:从服务器配置。

指定主服务器的ip及端口号即可。

7 Redis集群

7.1 集群的原理

7.2 投票容错

只要集群中超过半数的节点投票认为节点挂了就是挂了。

集群中至少应该有三个节点最好是奇数个节点。

7.3 如何把key分布存储到各个节点上

需要把key均匀分布到各个节点上。

引入了hash槽概念。

0~16383slot

Hello:500
Key1:1001
Key2:5300
Test:15200

每个服务器上分配一定数量的槽,先计算可以应该在那个槽上,然后查找槽在哪个服务器上,然后就把key放到哪个服务器上。
极限清空下每个服务器上一个槽,集群中最多有16384个节点。

7.4 集群的安装步骤

7.4.1 集群的环境

集群中至少应该有三个节点。

保证集群的高可用。每个节点都需要有个备份节点。

需要6台服务器,可以搭建伪分布式。可以使用6个redis实例模拟6个节点。需要修改redis的端口号7001~7006

7.4.2 集群的搭建步骤

第一步:创建6个redis实例,包装每个实例中没有数据。修改端口号7001~7006

第二步:修改redis.conf文件,把“cluster-enabled yes”前面的注释打开。

第三步:启动每个redis实例。

第四步:创建集群需要使用一个ruby脚本。

在/root/redis-3.0.0/src目录下有一个redis-trib.rb文件,需要使用此工具创建集群。

要运行此脚本需要ruby运行环境

1、安装ruby。

yum install ruby

yum install rubygems

2、安装脚本运行的ruby包。

[root@localhost ~]# gem installredis-3.0.0.gem

第五步:执行脚本创建集群。

./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006

[root@localhost redis-cluster]#./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006

>>> Creating cluster

Connecting to node 192.168.25.153:7001: OK

Connecting to node 192.168.25.153:7002: OK

Connecting to node 192.168.25.153:7003: OK

Connecting to node 192.168.25.153:7004: OK

Connecting to node 192.168.25.153:7005: OK

Connecting to node 192.168.25.153:7006: OK

>>> Performing hash slotsallocation on 6 nodes...

Using 3 masters:

192.168.25.153:7001

192.168.25.153:7002

192.168.25.153:7003

Adding replica 192.168.25.153:7004 to192.168.25.153:7001

Adding replica 192.168.25.153:7005 to192.168.25.153:7002

Adding replica 192.168.25.153:7006 to192.168.25.153:7003

M: 49af0e2135e47ab932f6a0a96cc505eff0e56216192.168.25.153:7001

slots:0-5460 (5461 slots) master

M: 4aeba4e1a5572d370638644876744270334dd52f192.168.25.153:7002

slots:5461-10922 (5462 slots) master

M: 4f1e76ba99466991870c34a62dcff7bf122564bc192.168.25.153:7003

slots:10923-16383 (5461 slots) master

S: e3827edac995e2951da48fdc7046ade942015b06192.168.25.153:7004

replicates 49af0e2135e47ab932f6a0a96cc505eff0e56216

S: 3a2ae8a126cd2b1e99fee4230b873ac01c6822a6192.168.25.153:7005

replicates 4aeba4e1a5572d370638644876744270334dd52f

S: 10cf464feea64a3e60dd600ce3a65b7894407369192.168.25.153:7006

replicates 4f1e76ba99466991870c34a62dcff7bf122564bc

Can I set the above configuration? (type'yes' to accept):
yes

>>> Nodes configuration updated

>>> Assign a different configepoch to each node

>>> Sending CLUSTER MEET messagesto join the cluster

Waiting for the cluster to join.....

>>> Performing Cluster Check(using node 192.168.25.153:7001)

M: 49af0e2135e47ab932f6a0a96cc505eff0e56216192.168.25.153:7001

slots:0-5460 (5461 slots) master

M: 4aeba4e1a5572d370638644876744270334dd52f192.168.25.153:7002

slots:5461-10922 (5462 slots) master

M: 4f1e76ba99466991870c34a62dcff7bf122564bc192.168.25.153:7003

slots:10923-16383 (5461 slots) master

M: e3827edac995e2951da48fdc7046ade942015b06192.168.25.153:7004

slots: (0 slots) master

replicates 49af0e2135e47ab932f6a0a96cc505eff0e56216

M: 3a2ae8a126cd2b1e99fee4230b873ac01c6822a6192.168.25.153:7005

slots: (0 slots) master

replicates 4aeba4e1a5572d370638644876744270334dd52f

M: 10cf464feea64a3e60dd600ce3a65b7894407369192.168.25.153:7006

slots: (0 slots) master

replicates 4f1e76ba99466991870c34a62dcff7bf122564bc

[OK] All nodes agree about slotsconfiguration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

[root@localhost redis-cluster]#

7.5 集群的使用

7.5.1 Redis-cli连接集群

[root@localhost redis01]# ./redis-cli -h192.168.25.153 -p 7004 -c

需要加上-c参数。

7.5.2 集群的查看命令

查看集群状态:

192.168.25.153:7003> cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:3

cluster_current_epoch:6

cluster_my_epoch:3

cluster_stats_messages_sent:868

cluster_stats_messages_received:868

192.168.25.153:7003>

查看集群中的节点:

192.168.25.153:7003> cluster nodes

10cf464feea64a3e60dd600ce3a65b7894407369192.168.25.153:7006 slave 4f1e76ba99466991870c34a62dcff7bf122564bc 01453878751105 6 connected

4aeba4e1a5572d370638644876744270334dd52f192.168.25.153:7002 master - 0 1453878752125 2 connected 5461-10922

49af0e2135e47ab932f6a0a96cc505eff0e56216192.168.25.153:7001 master - 0 1453878748035 1 connected 0-5460

e3827edac995e2951da48fdc7046ade942015b06192.168.25.153:7004 slave 49af0e2135e47ab932f6a0a96cc505eff0e56216 01453878749058 4 connected

4f1e76ba99466991870c34a62dcff7bf122564bc192.168.25.153:7003 myself,master - 0 0 3 connected 10923-16383

3a2ae8a126cd2b1e99fee4230b873ac01c6822a6192.168.25.153:7005 slave 4aeba4e1a5572d370638644876744270334dd52f 01453878750085 5 connected

192.168.25.153:7003>

注意:集群中只有一个数据库。

8 Redis的java客户端jedis

http://redis.io/

8.1 搭建一个maven工程

Maven工程的打包方式:jar

把jar包添加到工程中。

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.7.2</version>

</dependency>

8.2 使用jedis连接单机版

8.2.1 使用步骤

第一步:创建一个java工程

第二步:把jedis依赖的jar包导入工程。如果maven工程,添加jedis的坐标。

第三步:创建一个Jedis对象。构造方法中指定一个host、一个port两个参数。

第四步:调用redis的命令。每个redis命令在jedis中都对应一个方法。

第五步:关闭Jedis。

8.2.2 代码实现

@Test
public
void
testJedis()
throws
Exception {
//创建Jedis对象
Jedis jedis =
new
Jedis("192.168.25.153", 6379);
//向redis中添加key
jedis.set("jedis-test",
"123456");
//取key的值
String result =
jedis.get("jedis-test");
System.out.println(result);
jedis.close();
}

8.2.3 使用连接池

第一步:创建一个连接池对象,需要指定服务的ip及端口号。

第二步:从连接池中获得jedis对象。

第三步:使用jedis对象操作redis。

第四步:关闭jedis对象。

第五步:关闭连接池。

连接池是单例、jedis是多例的。

@Test
public
void
testJedisPool() throws Exception {
//创建连接池对象
JedisPool jedisPool =
new JedisPool("192.168.25.153", 6379);
//从连接池获得连接
Jedis jedis =
jedisPool.getResource();
//操作redis数据库
String result =
jedis.get("jedis-test");
System.out.println(result);
//关闭jedis对象
jedis.close();
//关闭连接池
jedisPool.close();
}

8.3 连接redis集群

8.3.1 使用步骤

第一步:创建一个JedisCluster对象,此对象在系统中单例。构造方法需要指定所有节点的ip及端口。

第二步:直接使用JedisCluster操作redis。

第三步:程序结束时关闭JedisCluster。

8.3.2 代码实现

@Test
public
void
testJedisCluster() throws Exception {
// 第一步:创建一个JedisCluster对象,此对象在系统中单例。构造方法需要指定所有节点的ip及端口。
Set<HostAndPort> nodes =
new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.25.153", 7001));
nodes.add(new HostAndPort("192.168.25.153", 7002));
nodes.add(new HostAndPort("192.168.25.153", 7003));
nodes.add(new HostAndPort("192.168.25.153", 7004));
nodes.add(new HostAndPort("192.168.25.153", 7005));
nodes.add(new HostAndPort("192.168.25.153", 7006));
JedisCluster jedisCluster =
new JedisCluster(nodes);
// 第二步:直接使用JedisCluster操作redis
jedisCluster.set("cluster",
"jedis cluster test");
String result =
jedisCluster.get("cluster");
System.out.println(result);
// 第三步:程序结束时关闭JedisCluster。
jedisCluster.close();
}

8.4 Jedis整合spring

8.4.1 连接单机版

8.4.1.1 开发步骤

第一步:把spring的jar包添加到工程。

第二步:创建一个spring的配置文件。

第三步:在spring的配置文件中配置一个连接池。

第四步:从连接池中获得jedis对象

第五步:操作数据库

第六步:关闭jedis

8.4.1.2 Spring配置

<?xml
version="1.0"
encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 配置JedisPool -->
<bean
id="jedisPool"
class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="6379"/>
</bean>

</beans>

8.4.1.3 代码

@Test
public
void
testSpringJedisPool()
throws Exception {
//初始化spring容器
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("classpath:applictionContext.xml");
//从容器中获得jedispool对象
JedisPool jedisPool =
applicationContext.getBean(JedisPool.class);
Jedis jedis =
jedisPool.getResource();
String result =
jedis.get("jedis-test");
System.out.println(result);
jedis.close();

}

8.4.2 连接集群

在spring配置文件中配置一个JedisCluseter对象。

<bean
id="jedisCluster"
class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean
class="redis.clients.jedis.HostAndPort">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="7001"/>
</bean>
<bean
class="redis.clients.jedis.HostAndPort">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="7002"/>
</bean>
<bean
class="redis.clients.jedis.HostAndPort">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="7003"/>
</bean>
<bean
class="redis.clients.jedis.HostAndPort">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="7004"/>
</bean>
<bean
class="redis.clients.jedis.HostAndPort">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="7005"/>
</bean>
<bean
class="redis.clients.jedis.HostAndPort">
<constructor-arg
name="host"
value="192.168.25.153"/>
<constructor-arg
name="port"
value="7006"/>
</bean>
</set>
</constructor-arg>
</bean>

Java代码

@Test
public
void
testSpringJedisCluster()
throws Exception {
// 初始化spring容器
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("classpath:applictionContext.xml");
JedisCluster cluster =
applicationContext.getBean(JedisCluster.class);
String result =
cluster.get("cluster");
System.out.println(result);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: