Redis[图文详解]

Redis

Redis简述与安装

关系型数据库:

特点:数据与数据之间,表与表之间,表和字段之间是存在关系的例如一对多,一对一,多对多  

优点:

1 数据之间有关系,进行数据的增删改查时候非常方便  

2 关系型数据库有事务操作,保证数据的完整性  

缺点:

1 因为数据和数据之间的关系,关系是由大量算法保证

大量算法会拉低系统的运行速度  

大量算法会消耗系统资源  

      2 大量数据的增删改查时显得无能为力

3 海量数据环境下对数据表进行维护,也会变得非常慢  

适合一般量数据的操作 安全

1. 事务

2. 磁盘

非关系型数据库 (not only sql)

为了处理海量数据,需要将关系型数据库的关系去掉。

非关系型数据库设计之初是为了替代关系型数据库

优点:

1 海量数据的增删改查,运用起来非常速度  

2 大量数据的维护非常轻松  

缺点:

1 数据和数据之间没有关系,所以不能一目了然

2 非关系型数据库,没有关系,没有强大的事务保证数据的完整和关系

适合处理海量数据,可以保证效率,但是不一定安全

Redis数据库简介

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的[整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但a++和a +=1就不是原子性操作]。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便

Redis的优点

以下是Redis的一些优点。

· 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。

· 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。

· 操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。

· 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

Redis使用环境

1 关系型数据库的缓存

2 可以做任务队列  

3 大量数据运算

什么时候使用Redis

1. 可作为关系型数据库的缓存

2. 海量数据查询

3. 安全性要求低

Redis安装

Redis是c语言开发,安装redis需要先要去官网下载源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc环境

yum install gcc-c++

步骤

1 上传redis文件   alt + p

redis-3.0.7.tar.gz

2 解压文件  

tar -zxvf redis-3.0.3.tar.gz

3 编译redis(编译:将.c文件编译为.o文件)

进入解压文件夹下 cd redis-3.0.0

执行make

4 安装

make PREFIX=/usr/local/redis install

注意:PREFIX=/usr/local/redis 是一个安装目录   PREFIX必须大写  

5安装完毕后    把redis-3.0.0下的redis.conf复制到安装的目录下

cp redis.conf /usr/local/redis

注意:如果没有配置文件redis也可以启动,不过将启动默认配置,这样不方便

我们修改其中的信息    

Redis启动方式

前端启动

1 执行服务端

先进入redis目录

执行./bin/redis-server

2 启动客户端

先进入redis目录

执行./bin/redis-cli

后端启动

后端启动需要修改配置文件,daemonize 改为yes 以后端的模式启动

启动时:指定配置文件  

./bin/redis-server ./redis.conf

Redis的关闭

1 查询到pid kill -9 pid (非正常关闭,一般不用,可能会造成数据丢失)

2 正常关闭

./bin/redis-cli shutdown

Redis数据类型

Redis使用的是键值对的方式保存数据  

key:全部是字符串

Value:  String  hash  list   set   有序的set集合

Redis命令-----String命令

字符串类型是Redis中最为基础,常用的数据存储类型,字符串在Redis中是二进制安全的,这意味着该类型存入和获取的数据类型相同,在Redis中字符串类型的value最多可容纳数据长度是512M

二进制安全(编码)与数据安全不是同一回事    

所谓的二进制安全体现在编码方面,如果是二进制安全不会出现乱码

关系型数据库(mysql)不是二进制安全的

非关系型数据库(redis)是二进制安全的  

关系型数据库不是二进制安全的

非关系型数据库是二进制安全的  

赋值

set key value :设定key持有指定的字符串value,如果该key存在则进行覆盖操作

取值:

get key 获取key的value,如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能获取String value,如果该key不存在则返回(nil)

删除:

del key

删除指定key 返回值是数字类型,表示删了几条数据

扩展

Incrby

incrby key value  给key增加value

Decrby

decrby key value 给key减少 value

String使用环境  

主要用于保存json格式的字符串

Redis命令------Hash

Redis中的Hash类型可以看成具有String key和value的map容器,所以该类型非常适合于存储值对象的信息。如username password 。如果Hash中包含很少的字段那么该类型的数据也将仅占用很少的磁盘空间,每一个Hash可以存储4 294 967 295个键值对

清空数据库:flushdb

赋值:

hset key field value :为指定的key设定field/value对(键值对)

hmset key field value : 设置key中的多个field/value

取值:

hget key field :返回指定的key中的field的值 ------针对String

hmget key field : 返回多个field/value ----针对Hash

hgetall key : 获取key中所有的field/value

删除:

hdel  key field : 可以删除一个或多个字段,返回值是被删除的字段个数

del key : 删除整个hash

增加数字

hincrby key field value 设置key中field的值增加value

了解命令  

hexists key  field  判断指定的key中的field是否存在   

hlen key  返回key所包含的field的数量

hkeys  key 获取所有的字段   

hvals key  获取所有key的值  

hset hashkey field book

hmset book price 10,20,30

hmset book num 66,55,44

hgetall book

1) "field"

2) "price,name,num"

3) "price"

4) "10,20,30"

5) "num"

6) "66,55,44

Jedis

jedis是redis的java版本的客户端实现

使用jedis连接redis数据库  

使用单实例的方式获取

Jedis jedis = new Jedis("192.168.11.130",6379);

//jedis.set("name", "haha");

System.out.println(jedis.get("name"));

上述代码执行会报错  connect timeout

打开防火墙的通讯地址

/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

/etc/rc.d/init.d/iptables save

使用jedis连接池的方式进行获取  

  

Redis----list-------LinkedList

为什么redis选取了链表  

Redis操作中,最多的操作是进行元素的增删  

使用环境:

1 做大数据集合的增删  

2 任务队列  

常用命令操作

存值

lpush key values 在指定的key所关联的list的头部插入所有的values,如果该key不存在该命令在插入之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据,插入成功,返回元素的个数  

rpush key values : 在该list的尾部添加数据

取值:

lrange key start end : 获取链表中从start 到 end 的元素的值,start end 从0开始计数,也可以为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,以此类推

127.0.0.1:6379> lpush list1 a b c d

(integer) 4

127.0.0.1:6379> rpush list2 a b c d

(integer) 4

127.0.0.1:6379> lrange list1 0 3

1) "d"

2) "c"

3) "b"

4) "a"

127.0.0.1:6379> lrange list2 0 3

1) "a"

2) "b"

3) "c"

4) "d"

127.0.0.1:6379> lrange list2 0 -1

1) "a"

2) "b"

3) "c"

4) "d"

127.0.0.1:6379> lrange list2 1 -2

1) "b"

2) "c"

删除  

lpop:返回并弹出指定的key关联的链表中的第一个元素,即头部元素,如果该key不存在,返回nil,如果key存在,则返回链表的头部元素  

rpop key  从尾部弹出元素 

获取链表的长度  

llen key 

127.0.0.1:6379> llen list1

(integer) 4

127.0.0.1:6379> lpop list1

"d"

127.0.0.1:6379> lrange list1 0 2

1) "c"

2) "b"

3) "a"

127.0.0.1:6379> rpop list1

"a"

127.0.0.1:6379> lrange list1 0 1

1) "c"

2) "b"

127.0.0.1:6379> lrange list1 0 3

1) "c"

2) "b"

删除某种元素(效率低)

lrem key count value 删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历删除,如果count等于0,则删除链表中所有等于value的元素  

127.0.0.1:6379> lrem list2 0 a

(integer) 1

127.0.0.1:6379> lrange list2 0 -1

1) "b"

2) "c"

3) "d"

127.0.0.1:6379> lrem list2 1 b

(integer) 1

127.0.0.1:6379> lrange list2 0 -1

1) "c"

2) "d"

127.0.0.1:6379> lrem list2 1 b

lpush    为链表的头部添加字符串元素

  格式:    lpush    mylist1    "allen"

  含义:在链表mylist1中,从头部添加一个元素allen

127.0.0.1:6379> lrange list2 0 -1

1) "c"

2) "d"

127.0.0.1:6379> lpush list2 a b

(integer) 4

127.0.0.1:6379> lrange list2 0 -1

1) "b"

2) "a"

3) "c"

4) "d"

Redis-无序set

特点:无序,不重复  

作用:

在Redis操作中,涉及到两个大数据的并集 交集,差集运算

添加 删除 取值元素  

添加

sadd key values  向set中添加数据,如果该key的值已有则不会重复添加

[和set key value有什么区别?]

Sadd是基于zset的,而set是基于String的

删除

srem key members:删除set中指定的成员

获取

smembers key : 获取set中所有的成员

sismember key member : 判断参数中指定的成员是否在该set中,1 表示存在,0 表示不存在或者该key本身就不存在(无论集合中有多少元素都可以快速的返回结果)

127.0.0.1:6379> sadd set1 a b c d

(integer) 4

127.0.0.1:6379> sadd set1 a b c d e

(integer) 1

127.0.0.1:6379> srem set1 a b

(integer) 2

127.0.0.1:6379> smembers set1

1) "c"

2) "d"

3) "e"

127.0.0.1:6379> sismember set1 c

(integer) 1

127.0.0.1:6379> sismember set1 a

(integer) 0

集合运算  

1 差集运算  

sdiff key1 key2 返回key1 key2 中相差的成员,而且与key的顺序有关,返回差集

2 交集运算  

sinter key1 key2 key3 返回交集  

3 并集运算  

sunion key1 key2 key3

127.0.0.1:6379> sadd set2 a b c

(integer) 3

127.0.0.1:6379> sdiff set1 set2

1) "e"

2) "d"

127.0.0.1:6379> sinter set1 set2

1) "c"

127.0.0.1:6379> sunion set1 set2

1) "b"

2) "e"

3) "d"

4) "c"

5) "a"

扩展命令  

scard key 获取set中的成员数量  

srandmember key 随机返回集合中的一个成员  

127.0.0.1:6379> scard set1

(integer) 3

127.0.0.1:6379> srandmember set1

"e"

127.0.0.1:6379> srandmember set1

"d"

127.0.0.1:6379> srandmember set1

"e"

sdiffstore value key1 key2  把key1 key2 的差集保存到value中

sinterstore

sunoinstore

把交集  并集   差集 的数据保存起来   

Redis-有序set--慎用 底层算法较多 除非涉及什么排行榜

特点  : 有序(大小顺序)  不重复  

有序set集合专门用来做排行榜

赋值  

zadd key  score member score member1 : 将所有成员以及该成员的分数存放到set集合中,如果该元素已经存在则会用新的分数替换原有的分数,返回值是新加入到集合中的元素的个数,不包含之前已经存在的元素  

取值:

zscore key member 返回指定成员的分数  

zcard key 获取集合中的成员数量   

删除

zrem key members: 移除集合中指定的成员,可以指定多个成员

范围查找  

zrange key start end【withscores】 : 获取集合中角标为start-end的成员,withscores参数表明返回的成员包含其分数  

127.0.0.1:6379> zadd set3 80 score1 90 score2

(integer) 2

127.0.0.1:6379> zscore set3 score1

"80"

127.0.0.1:6379> zcard set3

(integer) 3

127.0.0.1:6379> zrem set3 score1

(integer) 1

127.0.0.1:6379> zcard set3

(integer) 2

127.0.0.1:6379> zrange set3 0 -1

1) "score"

2) "score2"

127.0.0.1:6379> zrange set3 0 -1 withscores

1) "score"

2) "90"

3) "score2"

4) "90"

通用的Redis命令

1)keys pattern : 获取所有与pattern匹配的key,返回所有与该key匹配的keys。

1 *表示任意0个或多个字符

2 ? 表示任意一个字符  相当于正则表达式的”_”

127.0.0.1:6379> keys *

 1) "sex"

 2) "list1"

 3) "price"

 4) "name"

 5) "set3"

 6) "hash1"

 7) "names"

 8) "num"

 9) "set2"

10) "book"

11) "hashkey"

12) "age"

13) "add"

14) "set1"

15) "list2"

16) "sal"

17) "dept"

127.0.0.1:6379> keys ?

(empty list or set)

127.0.0.1:6379> keys ????

1) "name"

2) "set3"

3) "set2"

4) "book"

5) "set1"

6) "dept"

127.0.0.1:6379> keys ???

1) "sex"

2) "num"

3) "age"

4) "add"

5) "sal"

2)del key1 key2 删除

3)exists key : 判断该key是否存在,1代表存在,0代表不存在  

4)rename key newkey 为当前的key重命名  

5)expire key 设置过期时间 单位:秒  

Redis中的key默认是长久保存 通过删除命令修改key的生存时间

6)ttl key 获取该key所剩的超时时间,如果没有设置超时,返回-1,如果返回-2 表示超时不存在  

127.0.0.1:6379> expire name 10

(integer) 9

127.0.0.1:6379> ttl name

(integer) 7

127.0.0.1:6379> ttl name

(integer) 5

127.0.0.1:6379> ttl name

(integer) 2

127.0.0.1:6379> ttl name

(integer) -2

之后就没有name这个key了

7)type key 获取指定key的类型,该命令将以字符串的格式返回,返回的字符串为String list  set  hash zset 如果 key不存在返回none

127.0.0.1:6379> type set3

zset

127.0.0.1:6379> type set2

set

127.0.0.1:6379> type name

string

消息的订阅与发布  

可以理解新闻的订阅与发布  例如腾讯新闻

subscribe m1    订阅频道  

publish  m1  “heheda”    发布频道  

psubscribe m*    批量订阅

127.0.0.1:6379> subscribe china

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "china"

3) (integer) 1

1) "message"

2) "china"

127.0.0.1:6379> publish china "hahha"

(integer) 1

127.0.0.1:6379> subscribe china

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "china"

3) (integer) 1

1) "message"

2) "china"

3) "hahha"

多数据库

Redis也是有自己的数据库   与mysql不同redis的数据库已经提前创建好了,

Redis默认有16个数据库  0 1 2 。。。。。 15  默认操作都是发生在0号数据库上

数据库与数据库之间的不能切换数据

切换数据库:select 数据库的名字

把某个键值对进行数据库的移植

move newkey 1 将当前的key移植到1号数据库中  

数据库的清空   flushdb   慎用

redis服务器数据的清空  flushall   慎用

127.0.0.1:6379> select 0

OK

127.0.0.1:6379> keys *

1) "name"

127.0.0.1:6379> set name haha

OK

127.0.0.1:6379> get name

"haha"

127.0.0.1:6379> move name 1

(integer) 1

127.0.0.1:6379> get name

(nil)

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> get name

"haha"

Redis批量操作,----事务

Redis的事务与mysql不同  redis的事务是为了数据可以批量操作

JVM默认内存64M

multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行exec时,这些命令才会被原子操作,类似关系型数据库中的:begin transaction

exec:提交事务,类似于关系型数据库中的 commit   执行批量化

discard:事务回滚,类似于关系型数据库中的 rollback   不执行批量化

数据库的持久化

内存:高效,关机后数据就会消失

硬盘:读写速度慢,关机后数据依然存在  

关系型数据库mysql持久化  

任何增删改语句,都是在硬盘上做的操作  

断电以后,硬盘上的数据还是存在  

非关系型数据库redis

默认情况下,所有的增删改,数据都是在内存中操作。

关机以后内存中的数据不存在了

断电以后 redis的部分数据会丢失,丢失的数据是保存在内存中的数据

Redis的持久化  

Redis的持久化的策略   

Rdb:是redis的默认的持久化机制

Rdb相当于照快照,保存的是一种状态  

40G-----》400k

优点:

1 快照的速度快 还原速度快  

2 适用于灾难备份

缺点:

1 rdb 机制符合要求就会照快照,会占用一部分系统资源 (突然),很可能内存不足直接宕机

2 服务器正常关闭时,照快照

3 key满足一定条件,照快照

注意:内存小机器不适合使用,适用于内存充裕的机器

Rdb什么时候照快照  

1 服务器正常关闭时候,会照快照  

2 key满足一定条件,会照一次快照

如果把对应的rdb文件删除,redis数据库中就不会有数据存在

AOF:AppendOnly File的缩写,是Redis系统提供了一种记录Redis操作的持久化方案,在AOF生成的文件中,将忠实记录发生在Redis的操作,从而达到在Redis服务器重启或者当机之后,继续恢复之前数据状态的机制。

使用日志功能保存数据操作

默认aof机制是关闭的  

Aof的三种配置方式  

1 每秒同步  每秒进行一次aof保存数据  安全性低,比较节省系统资源

2 每修改同步   只要有key变化,就进行aof保存数据 比较安全,但是浪费效率

3 不同步     不进行任何持久化操作   

Aof操作:

只会保存导致key发生变化的语句 

Aof配置  

always : 每次有数据修改发生时都会写入aof文件  

everysec  : 每秒同步一次,该策略为aof的缺省策略

No : 从不同步,高效但是数据不会被持久化

开启aof机制

修改redis.conf配置文件中的数据

Aof的策略

优点:

持续性占用极少量的内存资源  

缺点:

1 日志文件会特别大,不适合灾难恢复  

2 恢复效率远远低于rdb文件

注意:适用于于内存小的计算机

猜你喜欢

转载自blog.csdn.net/weixin_38964895/article/details/81077875