非关系型数据库

NoSql课件

非关系型数据库

Memache,Redis

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

1.运行
 Memcached是多线程,非阻塞IO复用的网络模型
 Redis使用单线程的IO复用模型
    https://www.zybuluo.com/phper/note/595507

2.持久化
 Memcached不可以持久化
 Redis支持持久话保存

3.数据类型
  Memcached数据类型单一:只有get和set两个命令设置获取值
  Redis数据类型:字符串,哈希,列表,集合,有序集合

4.事务
  Memcached不支持事物,Redis支持事物

Memcache

Memcache简介

1. 缘起: 
    在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,
    这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。
    但是Web中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。
    此时Memcached或许是你想要的。
2. Memcached是什么?
    Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,
    用于在动态应用中减少数据库负载,提升访问速度。
3. Memcached能缓存什么?
    通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,
    包括图像、视频、文件以及数据库检索的结果等。
4. Memcached快么?
    非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,
    使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态),
    使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1)。
    Danga Interactive为提升Danga Interactive的速度研发了Memcached。
5. Memcached的特点
    Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问,
    因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,
    磁盘开销和阻塞的发生。

    缓存数据:
    1.在内存中缓存数据      2.数据形态以key->value结构     3.安全度非常差的

Memcache安装

1. Windows下操作:

1.1 在网上下载memcached-1.2.1-win32.zip。解压放某个盘下面,比如在c:\memcached
1.2 在终端(cmd)下:
    D:\AppServ>memcached.exe -d install     安装
    D:\AppServ>memcached.exe -d uninstall 卸载
    D:\AppServ>memcached.exe -d start   启动
    D:\AppServ>memcached.exe -d stop    停止
        memcached.exe -h  获取所有帮助
1.3 在启动之后连接:
    D:\AppServ> telnet 127.0.0.1 11211   --连接memcache端口11211
    使用quit退出。
1.4 其他命令参数:
    启动Memcache 常用参数
    -p <num>   设置端口号(默认不设置为: 11211)
    -U <num>   UDP监听端口(默认: 11211, 0 时关闭) 
    -l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP,
        有安全隐患,若设置为127.0.0.1就只能本机访问)
    -d   独立进程运行
    ... -d start 启动memcached服务 
    ... -d restart 重起memcached服务 
    ... -d stop|shutdown 关闭正在运行的memcached服务 
    ... -d install 安装memcached服务 
    ... -d uninstall 卸载memcached服务 
    -u <username> 绑定使用指定用于运行进程<username>
    -m <num>  允许最大内存用量,单位M (默认: 64 MB)
    -P <file> 将PID写入文件<file>,可以使得后边进行快速进程终止, 需要与-d 一起使用
    -M 内存耗尽时返回错误,而不是删除项 
    -c  最大同时连接数,默认是1024 
    -f 块大小增长因子,默认是1.25 
    -n 最小分配空间,key+value+flags默认是48 
    -h 显示帮助

2. Linux下安装操作:

2.1 #安装memcache源代码 
    http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz

    a.首先安装依赖包libevent
        Yum –y install libevent*    
        #centos6.8 错误?


    b.#主包已经安装,别忘记安装libevent-devel*,不然./configure过不去
        tar xzf /lamp/memcached-1.4.10.tar.gz       解压memcached
        cd /lamp/memcached-1.4.10               进入 memcached目录
        ./configure --prefix=/usr/local/memcache  配置
        make && make install                    编译与安装
        useradd  memcache                   添加memcache用户

    c.#因为系统不能用root运行memcache软件
        /usr/local/memcache/bin/memcached –umemcache &     #后台运行
        netstat –tunpl|grep :11211              查看端口
        telnet 192.168.10.1 11211               连接测试
        stats       memcache命令:查看当前状态

    d.写入自启动:
        vi /etc/rc.local
        /usr/local/memcache/bin/memcached –umemcache &

    e.#如何杀掉后台进程
        pkill memcached     

2.2 编译安装memcache
        tar  zxvf  memcache-2.2.5.tgz               解压软件包
        cd  memcache-2.2.5                          进入目录
        /usr/local/php/bin/phpize                   生成配置环境
        ./configure  --with-php-config=/usr/local/php/bin/php-config    配置
        make  &&  make  install                     编译和安装
                                                    修改php.ini  
        extension_dir = "/usr/local/php//lib/php/extensions/no-debug-non-zts-20060613/"
        extension="memcache.so";

Memcache相关操作

stats 查看状态

    STAT pid 1552                   服务进程的进程ID
    STAT uptime 3792                服务从启动到当前所经过的时间,单位是秒。
    STAT time 1262517674            服务器所在主机当前系统的时间,单位是秒。
    STAT version 1.2.6              组件的版本。这里是我当前使用的1.2.6。
    STAT pointer_size 32            服务器所在主机操作系统的指针大小,一般为32或64.
    STAT curr_items 1               表示存放当前的所有缓存对象的数量。不包括已经从缓存中删除的对象。
    STAT total_items 2              表示从启动到当前,系统存储过的所有对象数量,包括已经删除的对象。
    STAT bytes 593                  表示系统存储缓存对象所使用的存储空间,单位为字节。
    STAT curr_connections 2         表示当前系统打开的连接数。
    STAT total_connections 28       表示从memcached服务启动到当前时间,系统打开过的连接的总数。

set 写入缓存

    set  键名  标记  有效时间  数据的长度

    set  love  10     0           10
    i love you
        键名
            最大不能超过250个字符
        标记
            是一个16位的无符号的整数,该标志将和需要存储的数据一起存储,并在客户端get数据时返回
        有效时间
            单位为秒
        数据长度
            单位是字节
        数据的值
            最大不能超过1024kb

get 获取缓存

    get  键名
    get  love

delete 删除缓存

    delete   键名
    delete   love
    flush_all清空所有缓存

其它常用命令

存储:
    set  add  replace  append prepend 
获取:
    get
其它:

    incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作

    stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

    stats items 命令用于显示各个 slab 中 item 的数目和存储时长
    配合使用可以查看所有 key
    > stats items // 这条是命令
         STAT items:7:number 1 
         STAT items:7:age 188
         END
    > stats cachedump 7 0 // 这条是命令
        ITEM Sess_sidsvpc1473t1np08qnkvhf6j2 [183 b; 1394527347 s]
        END

PHP开启Memcache模块

phpinfo检测是否开启

php扩展目录 extension_dir
    php_memcache.dll放置到php扩展目录下

php配置文件修改
    extension=php_memcache.dll

重启服务

PHP与Memcache分布式缓存技术使用

//实例化Memcache
$memcache = new Memcache();

//连接Memcache
$memcache->connect('127.0.0.1','11211');
$memcache->addServer('127.0.0.1','11211');

//保存数据
$memcache->set('name','xiaohigh',MEMCACHE_COMPRESSED,60);

//获取数据
$memcache->get('name')

//清除所有数据
$memcache->flush();

PHP Memcahe类

connect(ip, port)       连接一台memcache服务器
addServer(ip, port)     添加一台memcache服务器
getExtendedStats()  获取连接池中所有的服务器信息
getServerStatus(host, port)     获取指定服务器的连接状态
add(key, value, tag, expires)           添加一条数据
replace(key, value, tag, expires)   修改一条数据
set(key, value, tag, expires)            添加或修改一条数据
get(key)    根据键获取值
delete(key) 删除指定一条数据
flush() 删除全部
close()  关闭连接
getStats()  获取memcache服务器信息  返回数组
getVersion()    获取memcache服务器版本号

【Memcache的安全】

我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,
这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,
重则服务器被入侵,因为Mecache是以root权限运行的,
况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,
所以危险性是可以预见的。

为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

[ 内网访问]
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。
普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,
那么就让Web服务器通过内网的网卡来访问Memcache服务器,
我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,
内网间的访问能够有效阻止其他非法的访问。

[ 设置防火墙]
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,
并且需要通过外网IP来访问Memcache的话,
那么可以考虑使用防火墙或者代理程序来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,
比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。

非关系型数据库 NoSQL

NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,指的是非关系型的数据库。
是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,
特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,
暴露了很多难以克服的问题,NoSQL的拥护者们提倡运用非关系型的数据存储,
相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

Nosql特点

它们可以处理超大量的数据。

它们运行在便宜的PC服务器集群上。
    PC集群扩充起来非常方便并且成本很低,避免了“sharding”操作的复杂性和成本。
它们击碎了性能瓶颈。
    通过NoSQL架构可以省去将Web或Java应用和数据转换成SQL友好格式的时间,执行速度变得更快。
    “SQL并非适用于所有的程序代码,” 对于那些繁重的重复操作的数据,SQL值得花钱。
    但是当数据库结构非常简单时,SQL可能没有太大用处。
没有过多的操作。
    虽然NoSQL的支持者也承认关系数据库提供了无可比拟的功能集合,
    而且在数据完整性上也发挥绝对稳定,他们同时也表示,企业的具体需求可能没有那么多。

NoSQL适用场景

1.对数据高并发读写
2.对海量数据的高效率存储和访问
3.对数据的高可扩展性和高可用性

Redis

Redis is an open source, advanced key-value store.
It is often referred to as a data structure server since keys can contain
strings, hashes, lists, sets and sorted sets. 

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

Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储有什么不同?

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。
Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,
因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,
在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。
同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

Redis 安装

Window 下安装

下载地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,
这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。

打开一个 cmd 窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.windows.conf 。
如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,
后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。


这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。
切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 。
设置键值对 set myKey abc
取出键值对 get myKey

Linux 下安装

下载地址:http://redis.io/download,下载最新文档版本。
本教程使用的最新文档版本为 2.8.17,下载并安装:
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,
还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:
下面启动redis服务.
$ cd src
$ ./redis-server
注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。
$ cd src
$ ./redis-server redis.conf
redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:
$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

配置redis使用环境:

现在,我们新建目录 /usr/local/redis ,
把./redis.conf,src/redis-server,src/redis-cli 三个文件复制到该目录下

mkdir /usr/local/redis
cp redis.conf src/redis-server src/redis-cli /usr/local/redis/
cd /usr/local/redis

Redis 数据类型

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

String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
实例
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob。
注意:一个键最大能存储512MB。
--------------------------------------------
   set 命令:设置一个键和值,键存在则只覆盖,返回ok
   > set 键  值    例如: >set name zhangsan

   get 命令:获取一个键的值,返回值
   > get 键     例如:>get name

   setnx命令:设置一个不存在的键和值(防止覆盖),
   > setnx 键 值      若键已存在则返回0表示失败

   setex命令:设置一个指定有效期的键和值(单位秒)
   > setex 键 [有效时间] 值  例如: >setex color 10 red
    不写有效时间则表示永久有效,等价于set

   setrange命令:替换子字符串 (替换长度由子子串长度决定)
   > setrange 键 位置 子字串
   > setrange name 4 aa  将name键对应值的第4个位置开始替换

   mset命令:批量设置键和值,成功则返回ok
   > mset 键1 值1 键2 值2 键3 值3 ....

   msetnx命令:批量设置不存在的键和值,成功则返回ok
   > msetnx 键1 值1 键2 值2 键3 值3 ....

   getset命令:获取原值,并设置新值

   getrange命令:获取指定范围的值
   >getrange 键 0 4     //获取指定0到4位置上的值

   mget命令: 批量获取值
   >mget 键1 键2 键3....

   incr命令: 指定键的值做加加操作,返回加后的结果。
   >  键        例如: >incr kid
   incrby命令: 设置某个键加上指定值
   > incrby 键 m    //其中m可以是正整数或负整数

   decr命令: 指定键的值做减减操作,返回减后的结果。
   > decr 键        例如: >decr kid
   decrby命令: 设置某个键减上指定值
   > decrby 键 m    //其中m可以是正整数或负整数

   append命令:给指定key的字符串追加value,返回新字符串值的长度
   >append 键 追加字串

   strlen求长度 >strlen 键名   //返回对应的值。

Hash(哈希)

Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
实例
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"
5) "points"
6) "200"
以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 
实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。
每个 hash 可以存储 232 -1 键值对(40多亿)。
------------------------------------------
hset命令:设置一个哈希表的键和值
  >hset hash名 键  值
  如:>hset user:001 name zhangsan
  hget命令: 获取执行哈希名中的键对应值

  hsetnx命令:设置一个哈希表中不存在的键和值
  >hsetnx hash名 键  值  //成功返回1,失败返回0
  如:>hsetnx user:001 name zhangsan

  hmset命令:hmset user:001 username zhangsan age 20 sex 1 批量设置
  hmget user:001 username age sex:批量获取值

  >hexists user:001 name //是否存在, 若存在返回1

  >hlen user:001  //获取某哈希user001名中键的数量

  >hdel user:001 name //删除哈希user:001 中name键

  >hkeys user:002   //返回哈希名为user:002中的所有键。
  >hvals user:002   //返回哈希名为user:002中的所有值。
  >hgetall user:002 //返回哈希名为user:002中的所有键和值。

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。
你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
实例
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

--------------------------------------------
   list即可以作为“栈”也可以作为"队列"。
操作:
 >lpush list1 "world"  //在list1头部压入一个字串
 >lpush list1 "hello"  // 在list1头部压入一个字串
 >lrange list1 0 -1  //获取list1中内容
    0:表示开头  -1表示结尾。

 >rpush list2 "world"  //在list2尾部压入一个字串
 >rpush list2 "hello"  // 在list2尾部压入一个字串
 >lrange list2 0 -1  //获取list2中内容
    0:表示开头  -1表示结尾。

 >linsert list2 before hello there
 在key对应list的特定位置前或后添加字符串

 >lset list2 1 "four"
 修改指定索引位置上的值

 >lrem list2 2 "hello"  //删除前两个hello值
 >lrem list2 -2 "hello" //删除后两个hello值
 >lrem list2 0 "hello"  //删除所有hello值

 >ltrim mylist8 1 3 //删除此范围外的值

 >lpop list2   //从list2的头部删除元素,并返回删除元素
 >rpop list2   //从list2的尾部删除元素,并返回删除元素
 >rpoplpush list1 list2 //将list1的尾部一个元素移出到list2头部。并返回

 >lindex list2 1 //返回list2中索引位置上的元素
 >llen list2 //返回list2上长度

Set(无序集合)

Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个string元素到,key对应的set集合中,
成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。
sadd key member
实例
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob

1) "rabitmq"
2) "mongodb"
3) "redis"
注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

-------------------------------
 >sadd myset "hello" //向myset中添加一个元素
  成功返回1,失败(重复)返回0

 >smembers myset //获取myset中的所有元素(结果是无序的)

 >srem myset "one" //从myset中删除一个one
  成功返回1,失败(不存在)返回0

 >spop myset //随机返回并删除myset中的一个元素
 >srandmember myset //随机获取myset中的一个元素,但是不删除

 > smove myset1 myset2 zhangsan:将myset1中zhangsan移动到myset2中
 > scard myset1 返回myset1的个数
 > sismember myset zhangsan:判断张三是否在myset中

 >sdiff myset1 myset2 //返回两个集合的差集
 以myset1为标准,获取myset2中不存在的。
 >sdiffstore dstset myset1 myset2 ...// 返回所有集合的差集,并保存到dstset中

 >sinter myset1 myset2 myset3... // 返回N个集合中的交集
 >sinterstore dstset myset1 myset2 ... // 返回N个集合的交集并存储到dstset中

 > sunion myset1 myset2 ...//返回所有集合的并集
 > sunionstore dstset myset1 myset2// 返回所有集合的并集,并存储到dstset中

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member 
实例
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000

1) "redis"
2) "mongodb"
3) "rabitmq"

----------------------------------------

 > zadd zset 1 one 向zset中添加one,排序为1排序
 > zrem zset one:删除zset中one

 > zincrby zset 2 one:如果one存在,则顺序增加2,如果one不存在,那么就是2

 > zrank zset one:返回one在zset中排名(从小到大的排序)
 > zrevrank zset one:返回one在zset中排名(从大到小的排序)

 > zrange zset 0 -1 withscores:根据score排序(根据score从小到大排序)
 > zrevrange zset 0 -1 withscores:根据score排序(根据score从大到小排序)

 > zrangebyscore zset 2 3 withscores:返回集合中score在给定区间的元素(包含2和5)
 > zcount zset 2 3:返回集合中给定区间的数量
 > zcard zset:返回集合中元素的个数
 > zscore zset one:返回one元素的score
 > zremrangebyrank zset 3 3:删除集合中排名在给定区间的元素
 > zremrangebyscore zset 1 2:将zset中从小到大排序结果的score在1-2之间的删除

Redis的常用命令

键值相关命令

 >keys *  //返回键(key)
 >keys list*   //返回名以list开头的所有键(key)
 >exists list1  //判断键名为list1的是否存在 存在返回1, 不存在返回0
 >del list1 //删除一个键(名为list1)
 >expire list1 10 //设置键名为list1的过期时间为10秒后
 >ttl list1 //查看键名为list1的过期时间,若为-1表示以过期
 >move age 1 //将键名age的转移到1数据库中。
 >select 1 //表示进入到1数据库中,默认在0数据库
 >persist age //移除age的过期时间(设置为过期)

服务器相关命令
 ping       测试连接是否存活
 echo       在命令行打印一些内容
 select     选择数据库。Redis数据库编号从0~15,我们可以选择任意一个数据库来进行数据的存取
 quit       退出连接
 dbsize     返回当前数据库中key的数目。
 flushdb    删除当前选择数据库中的所有key。
 flushall   删除所有数据库中的所有key

Redis高级实用特性

1. 安全性:为Redis添加密码

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

1.进入配置文件:
 vi /usr/local/redis/etc/redis.conf
 设置:requirepass redis的密码
2. 重启服务:
# ./redis-cli shutdown 执行关闭
# ./redis-server /usr/local/redis/etc/redis.conf  启动
3. 登录(两种)
# ./redis-cli 客户端命令链接服务器
>auth 密码值  //授权后方可使用

# ./redis-cli -a  密码 //连接时指定密码来进行授权

2. 主从复制

操作步骤:
 1.先将linux虚拟机关闭,之后克隆一个。
 2.启动两个虚拟机:master(主)和slave(从)
 3. 在slave(从)中配置一下ip地址
    # ifconfig eth0 192.168.128.229
    # ping 一下看看通不通。
 4. 配置从机
    进入:配置文件
    slaveof  192.168.128.228 6379   //配置连接主机的Redis的ip和端口
    masterauth 密码  //配置连接密码

    最后启动slave(从)机的Redis服务。

 其他:可以通过info命令中的role属性查看自己角色是master、slave

3. 事务处理

 >multi   //开启一个事务
 >set age 10 //暂存指令队列
 >set age 20
 >exec    //开始执行(提交事务)
 或>discard //清空指令队列(事务回滚)

4. 乐观锁

  在事务前对被操作的属性做一个:
 > watch age
 >multi   //开启一个事务(在此期间有其他修改,则此处会失败)
 >set age 10 //暂存指令队列
 >set age 20
 >exec    //开始执行(提交事务)
 或>discard //清空指令队列(事务回滚)

5. 持久化机制(通过修改配置文件做设置)

1. snapshotting(快照)默认方式
  配置    save
    save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
    save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
    save 60 10000
2. Append-only file(aof方式)
  配置 appendonly on 改为yes
  会在bin目录下产生一个.aof的文件

关于aof的配置
appendonly yes //启用aof 持久化方式
# appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
# appendfsync no //完全依赖os,性能最好,持久化没保证

6. 发布及订阅消息

需要开启多个会话端口
会话1:>subscribe tv1      //监听tv1频道
会话2:>subscribe tv1 tv2  //监听tv1和tv2频道
会话3: >publish tv1 消息   //向tv1频道发送一个消息

7. 使用虚拟内存

在redis配置文件中设置
vm-enabled yes          #开启vm功能
vm-swap-file  /tmp/redis.swap   #交换出来的value保存的文件路径
vm-max-memory 1000000   #redis使用的最大内存上限
vm-page-size 32         #每个页面的大小32字节
vm-pages 134217728      #最多使用多少页面
vm-max-threads 4        #用于执行value对象换入患处的工作线程数量

PHP操作Redis数据库

Redis扩展安装

一,为php环境安装Redis支持(加模块)
1. 将owlient-phpredis-2.1.1-1-g90ecd17.tar.gz文件传到服务器上
2. 解压文件后进入此目录
3. 由于目录中没有configure配置环境
 执行 /usr/local/php/bin/phpize 来准备一个编译环境
4. 配置: 加配置
 ./configure --with-php-config=/usr/local/php/bin/php-config

5. make 编译
6. make install 安装
7. 安装成功后就会在如下目录下产生一个redis.so文件
  /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
8. 安装后,使用vi 进入 /usr/local/php/etc/php.ini
   加上:extension=“redis.so”
9. 重启apache服务即可(查看phpinfo)


二,wamp环境安装

phpinfo检测是否开启

php扩展目录 extension_dir
    php_redis.dll放置到php扩展目录下

php配置文件修改
    extension=php_redis.dll

重启服务

PHP操作Redis

$redis=new Redis();  创建Redis对象
$redis->connect("localhost"); 连接Redis服务器    
$redis->auth("123");   使用密码做登陆验证
.....

Redis的数据应用设计

Redis在现实项目中应用

在线电影订票系统

本博客所有文章如无特别注明均为原创。作者:长颈鹿复制或转载请以超链接形式注明转自 SZY
原文地址《非关系型数据库

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)