Redis五种数据类型介绍

概述

Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合。本文详细介绍这五种数据类型的使用方法。本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方文档:Redis命令大全

字符串类型

字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串,包含二进制数据。可以用于存储邮箱,JSON化的对象,甚至是一张图片,一个字符串允许存储的最大容量为512MB。字符串是其他四种类型的基础,与其他几种类型的区别从本质上来说只是组织字符串的方式不同而已。

基本命令

字符串操作

  1. SET 赋值,用法: SET key value
  2. GET 取值,用法: GET key
  3. INCR 递增数字,仅仅对数字类型的键有用,相当于Java的i++运算,用法: INCR key
  4. INCRBY 增加指定的数字,仅仅对数字类型的键有用,相当于Java的i+=3,用法:INCRBY key increment,意思是key自增increment,increment可以为负数,表示减少。
  5. DECR 递减数字,仅仅对数字类型的键有用,相当于Java的i–,用法:DECR key
  6. DECRBY 减少指定的数字,仅仅对数字类型的键有用,相当于Java的i-=3,用法:DECRBY key decrement,意思是key自减decrement,decrement可以为正数,表示增加。
  7. INCRBYFLOAT 增加指定浮点数,仅仅对数字类型的键有用,用法:INCRBYFLOAT key increment
  8. APPEND 向尾部追加值,相当于Java中的”hello”.append(“ world”),用法:APPEND key value
  9. STRLEN 获取字符串长度,用法:STRLEN key
  10. MSET 同时设置多个key的值,用法:MSET key1 value1 [key2 value2 ...]
  11. MGET 同时获取多个key的值,用法:MGET key1 [key2 ...]

位操作

  1. GETBIT 获取一个键值的二进制位的指定位置的值(0/1),用法:GETBIT key offset
  2. SETBIT 设置一个键值的二进制位的指定位置的值(0/1),用法:SETBIT key offset value
  3. BITCOUNT 获取一个键值的一个范围内的二进制表示的1的个数,用法:BITCOUNT key [start end]
  4. BITOP 该命令可以对多个字符串类型键进行位运算,并将结果存储到指定的键中,BITOP支持的运算包含:OR,AND,XOR,NOT,用法:BITOP OP desKey key1 key2
  5. BITPOS 获取指定键的第一个位值为0或者1的位置,用法:BITPOS key 0/1 [start, end]

散列类型

散列类型相当于Java中的HashMap,他的值是一个字典,保存很多key,value对,每对key,value的值个键都是字符串类型,换句话说,散列类型不能嵌套其他数据类型。一个散列类型键最多可以包含2的32次方-1个字段。

基本命令

  1. HSET 赋值,用法:HSET key field value
  2. HMSET 一次赋值多个字段,用法:HMSET key field1 value1 [field2 values]
  3. HGET 取值,用法:HSET key field
  4. HMGET 一次取多个字段的值,用法:HMSET key field1 [field2]
  5. HGETALL 一次取所有字段的值,用法:HGETALL key
  6. HEXISTS 判断字段是否存在,用法:HEXISTS key field
  7. HSETNX 当字段不存在时赋值,用法:HSETNX key field value
  8. HINCRBY 增加数字,仅对数字类型的值有用,用法:HINCRBY key field increment
  9. HDEL 删除字段,用法:HDEL key field
  10. HKEYS 获取所有字段名,用法:HKEYS key
  11. HVALS 获取所有字段值,用法:HVALS key
  12. HLEN 获取字段数量,用法:HLEN key

列表类型

列表类型(list)用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段。列表内部使用的是双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度是O(1),获取越接近列表两端的元素的速度越快。但是缺点是使用列表通过索引访问元素的效率太低(需要从端点开始遍历元素)。所以列表的使用场景一般如:朋友圈新鲜事,只关心最新的一些内容。借助列表类型,Redis还可以作为消息队列使用。

基本命令

  1. LPUSH 向列表左端添加元素,用法:LPUSH key value
  2. RPUSH 向列表右端添加元素,用法:RPUSH key value
  3. LPOP 从列表左端弹出元素,用法:LPOP key
  4. RPOP 从列表右端弹出元素,用法:RPOP key
  5. LLEN 获取列表中元素个数,用法:LLEN key
  6. LRANGE 获取列表中某一片段的元素,用法:LRANGE key start stop,index从0开始,-1表示最后一个元素
  7. LREM 删除列表中指定的值,用法:LREM key count value,删除列表中前count个值为value的元素,当count>0时从左边开始数,count<0时从右边开始数,count=0时会删除所有值为value的元素
  8. LINDEX 获取指定索引的元素值,用法:LINDEX key index
  9. LSET 设置指定索引的元素值,用法:LSET key index value
  10. LTRIM 只保留列表指定片段,用法:LTRIM key start stop,包含start和stop
  11. LINSERT 像列表中插入元素,用法:LINSERT key BEFORE|AFTER privot value,从左边开始寻找值为privot的第一个元素,然后根据第二个参数是BEFORE还是AFTER决定在该元素的前面还是后面插入value
  12. RPOPLPUSH 将元素从一个列表转义到另一个列表,用法:RPOPLPUSH source destination

集合类型

集合在概念在高中课本就学过,集合中每个元素都是不同的,集合中的元素个数最多为2的32次方-1个,集合中的元素师没有顺序的。

基本命令

  1. SADD 添加元素,用法:SADD key value1 [value2 value3 ...]
  2. SREM 删除元素,用法:SREM key value2 [value2 value3 ...]
  3. SMEMBERS 获得集合中所有元素,用法:SMEMBERS key
  4. SISMEMBER 判断元素是否在集合中,用法:SISMEMBER key value
  5. SDIFF 对集合做差集运算,用法:SDIFF key1 key2 [key3 ...],先计算key1和key2的差集,然后再用结果与key3做差集
  6. SINTER 对集合做交集运算,用法:SINTER key1 key2 [key3 ...]
  7. SUNION 对集合做并集运算,用法:SUNION key1 key2 [key3 ...]
  8. SCARD 获得集合中元素的个数,用法:SCARD key
  9. SDIFFSTORE 对集合做差集并将结果存储,用法:SDIFFSTORE destination key1 key2 [key3 ...]
  10. SINTERSTORE 对集合做交集运算并将结果存储,用法:SINTERSTORE destination key1 key2 [key3 ...]
  11. SUNIONSTORE 对集合做并集运算并将结果存储,用法:SUNIONSTORE destination key1 key2 [key3 ...]
  12. SRANDMEMBER 随机获取集合中的元素,用法:SRANDMEMBER key [count],当count>0时,会随机中集合中获取count个不重复的元素,当count<0时,随机中集合中获取|count|和可能重复的元素。
  13. SPOP 从集合中随机弹出一个元素,用法:SPOP key

有序集合类型

有序集合类型与集合类型的区别就是他是有序的。有序集合是在集合的基础上为每一个元素关联一个分数,这就让有序集合不仅支持插入,删除,判断元素是否存在等操作外,还支持获取分数最高/最低的前N个元素。有序集合中的每个元素是不同的,但是分数却可以相同。有序集合使用散列表和跳跃表实现,即使读取位于中间部分的数据也很快,时间复杂度为O(log(N)),有序集合比列表更费内存。

基本命令

  1. ZADD 添加元素,用法:ZADD key score1 value1 [score2 value2 score3 value3 ...]
  2. ZSCORE 获取元素的分数,用法:ZSCORE key value
  3. ZRANGE 获取排名在某个范围的元素,用法:ZRANGE key start stop [WITHSCORE],按照元素从小到大的顺序排序,从0开始编号,包含start和stop对应的元素,WITHSCORE选项表示是否返回元素分数
  4. ZREVRANGE 获取排名在某个范围的元素,用法:ZREVRANGE key start stop [WITHSCORE],和上一个命令用法一样,只是这个倒序排序的。
  5. ZRANGEBYSCORE 获取指定分数范围内的元素,用法:ZRANGEBYSCORE key min max,包含min和max,(min表示不包含min,(max表示不包含max,+inf表示无穷大
  6. ZINCRBY 增加某个元素的分数,用法:ZINCRBY key increment value
  7. ZCARD 获取集合中元素的个数,用法:ZCARD key
  8. ZCOUNT 获取指定分数范围内的元素个数,用法:ZCOUNT key min max,min和max的用法和5中的一样
  9. ZREM 删除一个或多个元素,用法:ZREM key value1 [value2 ...]
  10. ZREMRANGEBYRANK 按照排名范围删除元素,用法:ZREMRANGEBYRANK key start stop
  11. ZREMRANGEBYSCORE 按照分数范围删除元素,用法:ZREMRANGEBYSCORE key min max,min和max的用法和4中的一样
  12. ZRANK 获取正序排序的元素的排名,用法:ZRANK key value
  13. ZREVRANK 获取逆序排序的元素的排名,用法:ZREVRANK key value
  14. ZINTERSTORE 计算有序集合的交集并存储结果,用法:ZINTERSTORE destination numbers key1 key2 [key3 key4 ...] WEIGHTS weight1 weight2 [weight3 weight4 ...] AGGREGATE SUM | MIN | MAX,numbers表示参加运算的集合个数,weight表示权重,aggregate表示结果取值
  15. ZUNIONSTORE 计算有序几个的并集并存储结果,用法和14一样,不再赘述。

原文链接:http://qifuguang.me/2015/09/29/Redis五种数据类型介绍/

NoSQL简介

什么是NoSQL

NoSQL是“Not only sql”的简称,泛指非关系型的数据库。

随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的
web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

NoSQL数据库的分类

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

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。常见的key-value数据库比如Redis。

列存储数据库

这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。因为列的数据结构天生是相似的,即便逻辑上每一行之间有细微的差异,仍旧比按行存储的结构聚合在一起的数据更利于压缩,因为大多数的压缩算法只关注有限的压缩接口,像增量压缩法和前缀压缩法这类专业算法,是基于列存储的数据定制的,能够大大提高压缩比,更高的压缩比更有利于在返回查询接口的时候降低带宽的消耗。比如Hbase就是这类数据库。

文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。

图形(Graph)数据库

图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API,比如 Infinite Graph。

NoSQL的共同特征

对于NoSQL并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:

  • 不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
  • 无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
  • 弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
  • 分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
  • 异步复制:和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
  • BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
    NoSQL数据库并没有一个统一的架构,两种NoSQL数据库之间的不同,甚至远远超过两种关系型数据库的不同。可以说,NoSQL各有所长,成功的NoSQL必然特别适用于某些场合或者某些应用,在这些场合中会远远胜过关系型数据库和其他的NoSQL。

参考文献

  • 百度百科
  • Lars george,代志远,刘佳,蒋杰,<<Hbase权威指南>>,人民邮电出版社,2013

原文链接:http://qifuguang.me/2015/08/04/[数据库]NoSQL简介/

Linux服务器知识

1、系统选择CentOS 系统,大部分的服务器都是使用CentOS系统。CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS并不包含封闭源代码软件。
2、安装好系统如何配置Web服务器
2.1 升级服务器yum update 平时也要经常更新,及时补上一些已公开的服务器漏洞。
2.2防火墙:CentOS5/6防火墙iptables, CentOS7 防火墙firewalld。防止漏洞攻击
服务器默认都已经安iptables软件
iptables配置和Firewalld配置
只开放需要的端口,白名单的形式开放端口。
2.3 SSH配置、配置端口或者key方式登录。安全入口
ssh配置文件一般是/etc/ssh/sshd_config
2.4 时间同步配置ntpdate 定时同步日期
安装:yum install ntpdate

2.5 磁盘分区及挂载 ext4文件系统,
fdisk dev 命令分区
mkfs.ext4 格式化磁盘分区
mount –t ext4 dev dir 挂载分区
编辑/etc/fstab 文件,防止重启后需要重新挂载
2.6 安装及配置VIM,默认的是vi编辑器。VIM更加强大,可以提高不少效率,还有语法高亮功能。
3、NMP配置
3.1 安装NMP需要的一些基础类库以及编译软件gcc等
yum -y install gcc gcc-c++ glibc automake autoconf libtool make pcre-devel libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel ncurses ncurses-devel
3.2 Nginx
Nginx 编译安装Nginx,官网下载最新稳定版本的Nginx,编译安装。
编译安装命令:
将Nginx加入到Service列表
chkconfig 如何使用
Nginx配置参数【对照实际系统讲解】
3.3 MySQL 编译安装 MySQL5.5.47
1、安装CMAKE (MySQL需要CMAKE方式安装)
2、安装MySQL
3、MySQL主从配置
4、MySQL用户级权限配置[最小权限原则]
4.4 PHP 安装
yum方式安装,安装php-fpm进程池方式管理软件;
php.ini配置
php-fpm.conf配置
4、PHP如何编译安装扩展【如何安装Yaf扩展】
1、安装 php-devel
2、下载Yaf并加压
3、进入加压目录执行
phpize;
./configure -–with-php-config=/php-config-pahth
make
make test
make install
4、修改php.ini

Linux日志文件及常用命令

<h4>日志文件说明</h4>
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
<h4>系统</h4>

uname -a # 查看内核/操作系统/CPU信息

cat /etc/issue

cat /etc/redhat-release # 查看操作系统版本

cat /proc/cpuinfo # 查看CPU信息

hostname # 查看计算机名

lspci -tv # 列出所有PCI设备

lsusb -tv # 列出所有USB设备

lsmod # 列出加载的内核模块

env # 查看环境变量

<h4>资源</h4>

free -m # 查看内存使用量和交换区使用量

df -h # 查看各分区使用情况

du -sh <目录名> # 查看指定目录的大小

grep MemTotal /proc/meminfo # 查看内存总量

grep MemFree /proc/meminfo # 查看空闲内存量

uptime # 查看系统运行时间、用户数、负载

cat /proc/loadavg # 查看系统负载

<h4>磁盘和分区</h4>

mount | column -t # 查看挂接的分区状态

fdisk -l # 查看所有分区

swapon -s # 查看所有交换分区

hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)

dmesg | grep IDE # 查看启动时IDE设备检测状况

<h4>网络</h4>

ifconfig # 查看所有网络接口的属性

iptables -L # 查看防火墙设置

route -n # 查看路由表

netstat -lntp # 查看所有监听端口

netstat -antp # 查看所有已经建立的连接

netstat -s # 查看网络统计信息

<h4>进程</h4>

ps -ef # 查看所有进程

top # 实时显示进程状态(另一篇文章里面有详细的介绍)

<h4>用户</h4>

w # 查看活动用户

id <用户名> # 查看指定用户信息

last # 查看用户登录日志

cut -d: -f1 /etc/passwd # 查看系统所有用户

cut -d: -f1 /etc/group # 查看系统所有组

crontab -l # 查看当前用户的计划任务

<h4>服务</h4>

chkconfig –list # 列出所有系统服务

chkconfig –list | grep on # 列出所有启动的系统服务

<h4>程序</h4>

rpm -qa # 查看所有安装的软件包

[科普] alpha版、beta版、rc版、trial版的意思

很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫“beta版”或者 “rc版”,特别是开源软件,甚至有“alpha版”,下面来解释一下各个版本的意思。

        alpha版:内部测试版。α是希腊字母的第一个,表示最早的版本,一般用户不要下载这个版本,这个版本包含很多BUG,功能也不全,主要是给开发人员和 测试人员测试和找BUG用的。

        beta版:公开测试版。β是希腊字母的第二个,顾名思义,这个版本比alpha版发布得晚一些,主要是给“部落”用户和忠实用户测试用的,该版本任然存 在很多BUG,但是相对alpha版要稳定一些。这个阶段版本的软件还会不断增加新功能。如果你是发烧友,可以下载这个版本。

         rc版:全写:Release Candidate(候选版本),该版本又较beta版更进一步了,该版本功能不再增加,和最终发布版功能一样。这个版本有点像最终发行版之前的一个类似 预览版,这个的发布就标明离最终发行版不远了。作为普通用户,如果你很急着用这个软件的话,也可以下载这个版本。

         stable版:稳定版。在开源软件中,都有stable版,这个就是开源软件的最终发行版,用户可以放心大胆的用了。

         trial版:试用版,通常都有时间限制,有些试用版软件还在功能上做了一定的限制。可注册或购买成为正式版。

         unregistered版:未注册版,通常没有时间限制,在功能上相对于正式版做了一定的限制。可注册或购买成为正式版。

另外,对于商业软件,还有一下版本:
RTM版:全称为Release to Manufacture。工厂版。改版程序已经固定,就差工厂包装、光盘印图案等工作了。
OEM版:厂商定制版。
EVAL版:评估版。就是有30或者60天等使用期限的版本。
RTL版:Retail.(零售版),这个版本就是真正发售的版本,有漂亮的包装、光盘、说明书等东西和高昂的价格。