目录
author:simplewu
redis英语全称:( remote dictionary server ) 远程字典服务器。
是完全开源免费的,用c语言编写的,遵守bsd协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的nosql数据库,是当前最热门的nosql数据库之一,也被人们称为数据结构服务器
redis通常被称为数据结构服务器,因为值(value)可以是 字符串(string), 哈希(map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
概念 : nosql(nosql = not only sql ),意即“不仅仅是sql”-泛指非关系型的数据库
解析:泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的sns类型的web2.0纯动态网站已经显得力不从心。
今天我们可以通过第三方平台(如:baidu,google,facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那sql数据库已经不适合这些应用了,
nosql数据库的发展能很好的处理这些大数据。和传统的关系型数据库相比,nosql具有以下的优势:
高并发读写:
针对短时间内具有高并发的情况,特别是短时间内大量的写入操作。传统数据库针对这种情况就有些力不从心了。
海量数据的高效率存储和访问:
现在的数据已经是非常庞大了,一些大型网站每天产生的数据量是相当恐怖的。存储了这么多的数据,查询效率就会受到很大的影响。
高科扩展性和高可用性:
基于传统数据库的结构,我们的数据库表是非常难以横向扩展的,比如增加一个新的字段时或者修改某个字段时,牵一发而动全身。
数据存储的方式单一:
在数据库中针对形形色色的数据,我们都只有采用表结构的方式来存储数据。
易扩展:
nosql数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
大数据量性能高:
nosql数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。
一般mysql使用query cache,每次表的更新cache就失效,是一种大粒度的cache,在针对web2.0的交互频繁的应用,cache性能不高。而nosql的cache是记录级的,是一种细粒度的cache,所以nosql在这个层面上来说就要性能高很多了
多样灵活的数据模型:
nosql无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦
对比:
redis 支持多种平台,大多数情况下考虑到内存会在linux下搭建redis服务器。
下载地址:
linux版本 http://www.redis.cn/download.html windowns版本 https://github.com/microsoftarchive/redis/releases
下载:
[root@localhost ~]# cd /usr/local/src/ [root@localhost src]# wget http://download.redis.io/releases/redis-4.0.6.tar.gz
解压:
[root@localhost src]# tar -zxf redis-4.0.6.tar.gz [root@localhost src]# ll total 1688 drwxrwxr-x. 6 root root 4096 dec 4 2017 redis-4.0.6 -rw-r--r--. 1 root root 1723533 dec 4 2017 redis-4.0.6.tar.gz
编译:
[root@localhost redis-4.0.6]# make # 如果编译失败请先下载编译依赖,编译成功不需要执行以下命令 yum install wget make gcc tcl
安装:
# 将redis安装到/usr/local/redis目录 [root@localhost redis-4.0.6]# make prefix=/usr/local/redis install # 进入redis安装目录 [root@localhost redis-4.0.6]# cd /usr/local/redis/bin/ [root@localhost bin]# ll total 35432 -rwxr-xr-x. 1 root root 5597214 aug 30 05:34 redis-benchmark -rwxr-xr-x. 1 root root 8314825 aug 30 05:34 redis-check-aof -rwxr-xr-x. 1 root root 8314825 aug 30 05:34 redis-check-rdb -rwxr-xr-x. 1 root root 5736370 aug 30 05:34 redis-cli lrwxrwxrwx. 1 root root 12 aug 30 05:34 redis-sentinel -> redis-server -rwxr-xr-x. 1 root root 8314825 aug 30 05:34 redis-server # 如果出现以上文件说明redis安装成功了
运行:
[root@localhost bin]# ./redis-server
使用内置的客户端命令redis-cli进行使用:
[root@localhost bin]# ./redis-cli 127.0.0.1:6379> set foo bar ok 127.0.0.1:6379> get foo "bar" 127.0.0.1:6379>
修改redis配置文件
# 复制redis.conf文件到/etc目录 [root@localhost redis-4.0.6]# cp /usr/local/src/redis-4.0.6/redis.conf /etc/redis.conf # 编辑redis.conf文件 [root@localhost ~]# vim /etc/redis.conf # 设置redis为后台启动进程,将daemonize no 改为 daemonize yes daemonize yes # 修改绑定的主机地址,将#bind 127.0.0.1改成自己的ip地址,去掉"#"号 bind 192.168.41.22
关闭redis服务,重新运行
[root@localhost bin]# ./redis-cli shutdown # 重新启动redis加载指定的配置文件 [root@localhost bin]# ./redis-server /etc/redis.conf
将redis-server和redis-cli命令加入环境变量
vim /etc/proflie # 在最后一行加入 export path=/usr/local/redis/bin:$path
使其立即生效
source /etc/proflie
如果不想手动编辑redis.conf文件可以通过redis提供的服务工具生成这部分可以不执行
[root@localhost ~]# cd /usr/local/src/redis-4.0.6/utils [root@localhost utils]# ./install_server.sh welcome to the redis service installer this script will help you easily set up a running redis server please select the redis port for this instance: [6379] selecting default: 6379 please select the redis config file name [/etc/redis/6379.conf] selected default - /etc/redis/6379.conf please select the redis log file name [/var/log/redis_6379.log] selected default - /var/log/redis_6379.log please select the data directory for this instance [/var/lib/redis/6379] selected default - /var/lib/redis/6379 please select the redis executable path [] /usr/local/redis/bin/redis-server selected config: port : 6379 config file : /etc/redis/6379.conf log file : /var/log/redis_6379.log data dir : /var/lib/redis/6379 executable : /usr/local/redis/bin/redis-server cli executable : /usr/local/redis/bin/redis-cli is this ok? then press enter to go on or ctrl-c to abort. copied /tmp/6379.conf => /etc/init.d/redis_6379 installing service... successfully added to chkconfig! successfully added to runlevels 345! starting redis server... installation successful! # 启动redis [root@localhost utils]# service redis_6379 start starting redis server... # 查看redis是否启动 [root@localhost utils]# service redis_6379 status redis is running (23804) # 关闭redis [root@localhost utils]# service redis_6379 stop stopping ... redis stopped
在我们windows下安装redis可以去微软github上下载,但是只提供了64位操作系统的。
这里我们下载 redis-x64-xxx.zip压缩包到 任意目录,解压后,将文件夹重新命名为 redis。redis分为服务器和客户端两种,必须启动服务器才能使用redis。
启动redis服务
启动方式来到doc界面输入:
redis-server
启动后出现这种玩意:
[2900] 20 nov 15:20:23.629 # warning: no config file specified, using the defaul t config. in order to specify a config file use redis-server /path/to/redis.conf _._ _.-``__ ''-._ _.-`` `. `_. ''-._ redis 3.2.100 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| port: 6379 | `-._ `._ / _.-' | pid: 2900 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [2900] 20 nov 15:20:23.637 # server started, redis version 3.2.100 [2900] 20 nov 15:20:23.637 * the server is now ready to accept connections on po rt 6379
其实解压后我们可以直接运行redis-server.exe也是可以启动的效果同上。
客户端连接服务器
doc界面输入:
redis-cli –h host –p port –a password
获取直接打开redis-cli.exe效果一致。
进程相关:单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。redis的实际处理速度完全依靠主进程的执行效率。
密码相关:统一密码管理,16个库都是同样密码,要么全部连上,要么一个也连接不上。
redis索引数据库索引从0开始
tring是redis最基本的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512m。
指令 | 描述 |
---|---|
set key value | 设置指定 key 的值。 |
get key | 获取指定 key 的值。 |
strlen key | 返回 key 所储存的字符串值的长度。 |
getrange key start end | 返回 key 中字符串值的子字符 |
setrange key offset value | 这个命令的作用是覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。 |
getset key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
incr key | 将 key 中储存的数字值增一。 |
incrby key increment | 将 key 所储存的值加上给定的增量值(increment) 。 |
decr key | 将 key 中储存的数字值减一。 |
decrby key decrement | key 所储存的值减去给定的减量值(decrement) 。 |
mget key1 [key2..] | 获取所有(一个或多个)给定 key 的值。 |
mset key value [key value ...] | 同时设置一个或多个 key-value 对。 |
append key value | 如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。 |
redis hash:是一个string类型的field和value(以键值)的映射表,hash特别适合用于存储对象。
存储大小:每个 hash 可以存储 232 - 1 键值对(40多亿)。
案例:设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中
指令 | 描述 |
---|---|
hset key field value | 将哈希表 key 中的字段 field 的值设为 value 。 |
hset key field value | 将哈希表 key 中的字段 field 的值设为 value 。 |
hget key field | 获取存储在哈希表中指定字段的值。 |
hmset key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
hmget key field1 [field2] | 获取所有给定字段的值 |
hgetall key | 获取在哈希表中指定 key 的所有字段和值 |
hdel key field1 [field2] | 删除一个或多个哈希表字段 |
hexists key field | 查看哈希表 key 中,指定的字段是否存在 |
hkeys key | 获取所有哈希表中的字段 |
hlen key | 获取哈希表中字段的数量 |
hsetnx key field value | 只有在字段 field 不存在时,设置哈希表字段的值 |
hvals key | 获取哈希表中所有值 |
redis列表list:
redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
存储数据量:
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
指令 | 描述 |
---|---|
lpush key value1 [value2] | 将一个或多个值插入到列表头部 |
rpush key value1 [value2] | 将一个或多个值插入到列表尾部 |
lrange key start stop | 获取列表指定范围内的元素 |
lpop key | 移出并获取列表的第一个元素 |
rpop key | 移除并获取最后一个元素 |
lindex key index | 通过索引获取列表中的元素 |
llen key | 获取列表长度 |
ltrim key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
lrem key | 移除列表元素 |
lset key index value | 通过索引设置列表元素的值 |
linsert key before|after pivot value | 在列表的元素前或者后插入元素 |
redis 集合-set
redis的set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是o(1)。
存储数据量:
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
指令 | 描述 |
---|---|
sadd key member1 [member2] | 向集合添加一个或多个成员 |
scard key | 获取集合的成员数 |
smembers key | 返回集合中的所有成员 |
sismember key member | 判断 member 元素是否是集合 key 的成员 |
srem key member1 [member2] | 移除集合中一个或多个成员 |
srandmember key [count] | 返回集合中一个或多个随机数 |
spop key | 移除并返回集合中的一个随机元素 |
smove source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
redis 有序集合(sorted set):
redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
存储数量:集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是o(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
指令 | 描述 |
---|---|
zadd key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
zrange key start stop [withscores] | 通过索引区间返回有序集合成指定区间内的成员 |
zrangebyscore key min max [withscores][limit] | 通过分数返回有序集合指定区间内的成员 |
zrem key member [member ...] | 移除有序集合中的一个或多个成员 |
zremrangebylex key min max | 移除有序集合中给定的字典区间的所有成员 |
zcard key | 获取有序集合的成员数 |
zcount key min max | 计算在有序集合中指定区间分数的成员数 |
zrevrank key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
zscore key member | 返回有序集中,成员的分数值 |
zrevrange key start stop [withscores] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
zrevrangebyscore key max min [withscores] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
zscan key cursor [match pattern][count count] | 迭代有序集合中的元素(包括元素成员和元素分值) |
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
string | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512m | |
hash | 键值对集合,即编程语言中的map类 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
list | 链表(双向链表) | 增删快,提供了操作某一段元素的api | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
set | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是o(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
sortedset | 将set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
如对本文有疑问, 点击进行留言回复!!
MongoDB中数据的替换方法实现类Replace()函数功能详解
理解Redis持久化,RDB持久化和AOF持久化的不同处理方式
网友评论