redis

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis相关的知识,希望对你有一定的参考价值。

目录

一、什么是nosql????1

1NoSQL的基本说明:????1

2)兴起的原因:????1

3)特点:????1

4)常见的nosql产品????1

二、redis的基本介绍????2

三、redis的安装????2

四、redis的数据类型????3

五、redis的数据类型讲解相关命令????6

1string类型????6

2hashes类型????10

3lists类型及操作????12

4sets类型及操作????15

5sorted sets类型及操作????19

6redis常用命令????23

六、redis的安全性。????28

七、持久化机制????28

九、php支持redis????30

十、案例完成用户注册系统。????31

?

?

一、什么是nosql

(1)NoSQL的基本说明:

NoSQL(NoSQL = Not Only SQL),意味反sql运动,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。它指的是非关系型的数据库。

(2)兴起的原因:

随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模高并发的sns类型的web2.o纯动态网站已经显得力不从心,暴露了很多难以克服的 问题,而非关系型的数据库则由于本身的特点得到了非常迅速的发展。

(3)特点:

优点:

高并发读写的性能

大数据量的扩展(分布式存储)

配置简单

灵活、高效的操作与数据模型

低廉的成本

不足之处:

没有统一的标准

没有正式的官方支持

各种产品还不算成熟

(4)常见的nosql产品

新浪微博 Redis

Google????????????????????Bigtable

Amazon????????????????????SimpleDB

淘宝数据平台????????????????Tair

优酷视频????????????????????MongoDB

飞信空间????????????????????HandlerSocket

视觉中国网站????????????????MongoDB

?

二、redis的基本介绍

redis是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含字符串哈希链表集合有序集合

(1)架构方式:c/s 客户端和服务器

(2)memcache存储数据的位置:内存中。

redis:可以存储到内存中,可以把数据同步 到硬盘中,达到数据的存储持久化。

(3)memcache存储数据类型的格式:键值对。没有行和列的概念

redis:数据存储是,键值对存储,只不过存储的值的类型比较丰富,有五种类型,string(字符串),hash(哈希),list(链表),set(集合),zset(有序集合)

?

基本介绍:

(1)Redis是一个Key-Value存储系统。

(2)它支持存储的value类型很多,包括string(字符串)list(链表)set(集合)、Zset(有序集合)这些数据类型都支持push/pop、add/remove及取交集和并集及更丰富的操作、Redis支持各种不同方式的排序。

(3)为了保证效率数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

(4)提供的API语言包括:C、C++、C#、Clojure Common Lisp Erlang Haskell Java javascript Lua Objective-C Perl PHP Python Ruby Scala Go Tcl

?

三、redis的安装

(1)下载安装包:

http://redis.googlecode.com/files/redis-2.4.17.tar.gz

(2)编译程序:

tar zxvf redis-2.4.17.tar.gz

cd redis-2.4.17

make

cd src && make install

(3)为了便于管理,新建redis的管理目录

技术分享

(4)把配置文件移动到新建的etc目录下面(配置文件在redis解压目录中)。

技术分享

(5)把解压目录下面的src目录下面的一些文件移动到新建的bin目录下

mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin

?

技术分享

(6)启动服务,通过bin目录下面的redis-server

启动格式:redis-server 指定的配置文件

技术分享

?

启动后,会占用当前的会话窗口,我们应该让他在后台启动,因此要修改配置文件。

(7)修改配置文件,让他从后台启动。打开配置文件/etc/redis.conf,把

daemonize如果需要在后台运行,把该项改为yes

技术分享技术分享技术分享

(8)关闭redis的服务重新启动。

技术分享

(9)客户端连接。

技术分享

四、redis的数据类型

string(字符串):类似于memcache里面的数据存储方式

key values

技术分享

?

hash(哈希):类似于关系型数据库里面的行,

也是键值对,值里面又有键值对。

技术分享

list(链表):可以模拟队列和栈。数据存储是有顺序的。

队列:先进先出。

栈:先进后出。

?

技术分享模拟栈

技术分享技术分享

模拟队列:

技术分享

set(集合)

集合的示意图:

技术分享

?

zset(有序集合) 集合里面的内容是有序的。

技术分享

?

五、redis的数据类型讲解相关命令

1、string类型

String是最简单的类型,一个 key对应一个Value,String类型是二进制安全的。Redis的 string可以包含任何数据,比如jpg图片或者序列化的对象。

(1)set

设置键,值

语法:set 键名称 值

例如:我们添加一个name="hanguo"的键值对。

重新设置则直接覆盖。

技术分享

(2)get

获取key对应的string值,如果key不存在返回 nil,

语法:get 键值

技术分享

(3)Setnx

设置键时,先判断一下该键是否存在,如果key已经存在,返回0,nx是not exist的意思。

若键已经存在,则设置不成功,返回0

技术分享

(4)setex

设置key对应的值为string类型的value,并指定此键值对应的有效期。

语法:setex 名称 有效期 值

例如:我们添加一个color = red的键值对,并指定有效期为10秒。

技术分享

(5)setrange

替换字符串中某些字符

语法:setrange 键名称 开始替换的序号 替换为的内容

例如:我们希望将hanguo的sohu邮箱替换为qq.com邮箱

技术分享

(6)mset

一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。

语法:

mset 名称1 值1 名称2 值2

技术分享

(7)msetnx

一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。

技术分享

(8)getset

设置key的值,并返回key的旧值。(设置新值,获取旧值。)

技术分享

(9)getrange

获取key的value值的范围内的子字符串

getrange name 0 5

(10)mget

一次获取多个key的值,如果对应key不存在则对应返回nil。

技术分享

(11)incr

对key的值做加加操作,并返回新的值。

incrby

同incr类似,加指定值,key不存在时候会设置key,并认为原来的value是0。

技术分享

(12)decr

对key的值做减减操作。

decrby

同decr类似,减指定值

技术分享

(13)append

给指定key的字符串追加value,返回新字符串值的长度。

技术分享

(14)strlen

取指定key的value值的长度。

技术分享

2、hashes类型

Redis hash是一个string类型的field和value的映射表。它的添加、删除操作都是0(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。

(1)hset

设置hash field为指定值,如果 key不存在,则先创建。

语法:

hset 哈希名称 字段名称 值

技术分享

(2)hget

取出hash field的值。语法:hget 哈希名称 字段名称

技术分享

(3)hsetnx

设置hash field为指定值,如果key不存在,则先创建,如果存在则返回0。

技术分享

(4)hmset

同时设置hash的多个field

语法:hmset 哈希名称 field1 value1 field2 value2

技术分享

(5)hmget

获取全部指定的hash field。

语法:hmget 哈希名称 field1 field2

技术分享

(6)hincrby

指定的 hash field加上给定的值。

技术分享

(7)hexists

测试指定的 field是否存在。

技术分享

(8)hlen

返回指定hash的field数量。

技术分享

(9)hdel

删除指定hash的field

语法:hdel 哈希名 field

技术分享

(10)hkeys

返回hash的所有field

技术分享

(11)hvals

返回hash的所有 value。

技术分享

(12)hgetall

获取某个hash中全部的field及value

技术分享

3、lists类型及操作

list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key 理解为链表的名字。redis的list类型其实就是一个每个子元素都是string 类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list即可以作为栈,又可以作为队列。

(1)lpush

在key对应list的头部添加字符串元素。

语法:lpush 链表名称 值内容

技术分享

(2)lrange

获取链表里面的值,语法:lrange 链表名称 0 -1

注意0 和 -1 表示取值范围,从头部到尾部。

?

(3)rpush

在key对应list的尾部添加字符串元素。

语法:rpush 链表名称 值内容

?

技术分享

(3)linsert

在key对应list的特定位置前或后添加字符串。

技术分享

(4)lset

设置list中指定下标的元素值。注:下标从0开始计算

技术分享

(5)lrem

从key对应list中删除n个和value相同的元素。(n<0从尾删除,n=0全部删除)

技术分享

(6)ltrim

保留指定key的值范围内的数据。

技术分享

(7)lpop

从list的头部删除元素,并返回删除元素。

技术分享

(8)rpop

从 list的尾部删除元素,并返回删除元素。技术分享

(9)rpoplpush

从第一个list的尾部移除元素并添加到第二个list的头部。

技术分享

(10)lindex

返回名称为key的list中 index位置的元素。

技术分享

(11)llen

返回key对应list的长度。

技术分享

4、sets类型及操作

set是集合,它是string类型的无序集合。set是通过hash table实现的、添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。

(1)sadd

向名称为key 的set中添加元素。

语法:sadd 集合名 元素

技术分享

(2)smembers 获取集合中内容,语法:smembers 集合名称

(3)srem

删除名称为key的set中的元素.

技术分享

(4)spop

随机返回并删除名称为key的 set中一个元素。

技术分享

(5)sdiff

返回所有给定key与第一个key的差集。

技术分享

(6)sdiffstore

返回所有给定key与第一个key的差集,并将结果存为另一个key。

语法:sdiffstore 新的集合 集合1 集合2

技术分享

(7)sinter

返回所有给定key的交集.

技术分享

(8)sinterstore

返回所有给定key的交集,并将结果存为另一个key

技术分享

(9)sunion

返回所有给定key的并集

技术分享

(10)sunionstore

返回所有给定key的并集。

技术分享

(11)smove

从第一个key对应的set中移除member并添加到第二个对应的set中。

技术分享

(12)scard

返回名称为key的set的元素个数。

技术分享

(11)sismember

测试member是否是名称为 key的set的元素

技术分享

(12)srandmember

随机返回名称为key的set的一个元素,但不删除元素

技术分享

5、sorted sets类型及操作

sorted set是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。操作中的key理解为zset的名字。

(1)zadd

向名称为key的zset中添加元素。如果该元素存在,则更新其顺序。

语法:zadd 集合名 序号 内容

技术分享

(2)zrange

获取有序集合中的内容

技术分享

(3)zrem

删除名称为key的zset中的元素member。

技术分享

(4)zincrby

如果在名称为key的zset中已经存在元素member,则该元素的score增加increment否则向该集合中添加该元素,其score的值为increment。

技术分享

(5)zrank

返回名称为key的zset中member元素的排名(按score从小到大排序)即下标。

技术分享

(6)zrevrank

返回名称为key的zset中member元素的排名(按score从大到小排序)即下标。

技术分享

(7)zrevrange

返回名称为key的zset(按score从大到小顺序)中的index从start到end的所有元素。

技术分享

(8)zrangebyscore

返回集合中score在给定区间的元素

技术分享

(9)zcount

返回集合中score在给定区间的数量。

技术分享

(10)zcard

返回集合中元素的个数

技术分享

(11)zremrangebyrank

删除集合中排名在给定区间的元素。技术分享

(12)zremrangebyscore

删除集合中score在给定区间的元素。

技术分享

6、redis常用命令

redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在linux终端使用。

1、键值相关的命令

(1)keys

返回满足给定参数的所有key

用表达式*,代表取出所有的key

技术分享

(2)exists

确认一个key是否存在。

技术分享

(3)expire

设置一个key的过期时间

技术分享

(4)move:

将当前数据库中的key转移到其它数据库中。

技术分享

(5)persist

移除给定key的过期时间

技术分享

(6)randomkey

随机返回key空间的一个key

技术分享

(7)rename

重命名key

技术分享

(8)type:返回值的类型

技术分享

2、服务器相关命令

(1)select

选择数据库。redis数据库编号从0-15,我们可以选择任意一个数据库来进行数据的存取。

当选择16时,报错,说明没有编号为16的这个数据库。

技术分享

(2)quit

退出连接

技术分享

(3)dbsize

返回当前数据库中key的数目

技术分享

(4)info

获取服务器的信息和统计。

技术分享

(5)config get

获取参数的配置。

本例中我们获取了dir这个参数配置的值,如果想获取全部参数的配置只需要执行"config get *"即可将全部的值都显示出来

技术分享

(6)flushdb

删除当前选择数据库中的所有db

技术分享

(7)flushall

删除所有数据库中的所有的 key

技术分享

?

六、redis的安全性。

设置客户端连接后进行任何其他操作前需要使用的密码。

注意:因为 redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。

(1)设置密码的方式,打开redis的配置文件。

#requirepass 设置的密码

比如:requirepass guangzhou

技术分享

设置完密码后,redis服务要重启。

(2)设置完成密码后,客户端登录方式:

第一种方式:登录后,执行auth 设置的密码 后才能操作,否则不能任何操作。

技术分享

第二种方式:在登录时,输入密码

/usr/local/redis/bin/redis-cli –a 设置的密码

技术分享

七、持久化机制

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。

redis支持两种持久化方式:

(1)snapshotting(快照)默认方式

?

快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key修改就自动做快照。

技术分享

快照方式的缺点:

由于快照方式是在一定间隔做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。

?

(2)append-only file( 缩写aof)的方式

aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

aof方式

当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。

可以通过配置文件告诉reids我们想要通过fsync函数强制os写入到磁盘的时机。

技术分享

?

八、redis配置文件常用的项

?

daemonize如果需要在后台运行,把该项改为yes

pidfile:配置多个pid的地址 默认在/var/run/redis.pid

bind:绑定ip,设置后只接受来自该ip的请求。

port:监听端口,默认为6379

timeout:设置客户端连接时的超时时间,单位为秒。

logfile:配置log文件的地址。

databases:设置数据库的个数,默认使用的数据库为0

sava:设置redis进行数据库镜像的频率。

rdbcompression:在进行镜像备份时,是否进行压缩。

Dbfilename:镜像备份文件的文件名。

Dir:数据库镜像备份的文件放置路径。

Slaveof:设置数据库为其他数据库的从数据库。

Masterauth:主数据库连接需要的密码验证。

Requirepass:设置登录时需要使用的密码。

Maxclients:限制同时连接的客户数量

Maxmemory:设置redis能够使用的最大内存。

Appendonly:开启append only模式。

九、php支持redis

(1)下载扩展,在下载扩展时要注意,和php的版本要兼容。

技术分享

技术分享

(2)把对应的扩展拷贝到,php的安装目录ext目录下面。

技术分享

(3)打开php.ini文件,引入扩展。

技术分享

(4)重启apache进行测试,写一个文件,运行phpinfo()函数测试;

技术分享

(5)基本使用

技术分享

十、案例完成用户注册系统。

add.php:页面是用户注册的一个页面:

reg.php:接收提交的表单完成,入数据库。

redis.php:连接数据库的文件。

list.php:注册用户列表页面

edit.php:编辑页面,

update.php:接收修改数据,完成入库

delete.php:删除页面

login.php:用户登录页面

loginok.php:完成登录处理的页面。

addfans.php:添加关注的页面

以上是关于redis的主要内容,如果未能解决你的问题,请参考以下文章

Redis专题-初识Nosql

mongodb nosql redis memcached 是什么?

Redis NoSql数据库

Redis学习笔记1:NoSQL是什么?

Redis学习笔记1:NoSQL是什么?

Redis-NoSql是什么能干嘛,与关系型数据库的区别