简介

redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统,它经常被拿来和Memcached相比较,但是Memcached不提供持久化的数据保存机制而redis可以将数据保存在磁盘中,redis不仅仅是能够存储key和value这种简单的键值对,还能存储例如集合、hash表、列表、字典等。redis在整个运行过程中,数据统统都是存储在内存中的,因此,性能是相当高的,由于此特性,redis对于内存的要求比较高,它会周期性的将内存中的数据写入在磁盘中,从而实现数据持久化的访问能力,但是这种存储只是保证redis在下次启动还有数据可以读取,而不是提供访问。redis是单线程服务的,只有一个线程。redis还支持主从模式以及支持通过lua脚本去编写扩展,并且支持高可用和分布式集群解决方案。

Redis特点

  1. 运行在内存
  2. 持久化
  3. 主从(借助于sentinel实现一定意义上的HA)
  4. Clustering(分布式存储)
  5. 数据机构服务器:支持存储string、list、hash、set、Sorted Set,Bitmap,HyperLoglogs
  6. 能够作为队列使用

备注:redis是单线程,但是这并不意味着会成为运行时的瓶颈,每秒能够支撑50W的并发

哪些公司在使用

  • Twitter
  • pinterest
  • tumblr
  • github
  • stack overflow
  • digg
  • blizard
  • flickr
  • weibo

数据库存储系统分类

常见的数据库系统有以下几类:

  1. RDBMS:Oracle、DB2、Mysql
  2. NoSQL:MongoDB、Redis、HBase、Memcached
  3. NewSQL:Aerospike、FounddtionDB、RethinkDB

而NoSQL又分为以下几类:

  1. Key-Value NoSql:Memcached、Redis
  2. Column family NoSQL:Cassandra、HBase
  3. Documentation NoSQL:MongoDB
  4. Graph NoSQL:Neo4j

Redis 3.0

  • 2015年4月1日正式推出,它的特性:
  • redis cluster
  • 新的"embedded string"
  • LRU演算法的改进:预设随机取5个样本,插入并排序至一个pool。移除最佳者,如此反复,直到内存用量小于maxmemory的设定。

Redis的组件

最早只有1W行代码,网址是http://www.redis.io,它的组件有:

  1. redis-server
  2. redis-cli
  3. redis-benchmark(压测工具)
  4. redis-check-dump && redis-check-aof 能够去检测文件是否损坏两种格式RDB/AOF格式

redis的安装

redis的安装是非常简单的,你甚至都不需要去configure,直接make && makeinstall make也不需要带过多的参数。

官网:

  1. 编译

    wget -c http://download.redis.io/releases/redis-3.0.6.tar.gz
    tar xvf redis-version.tar.gz
    cd redis-version
    make && make install

    注意:安装需要编译环境,例如gcc等必要工具的支持

2.提示缺少tcl,可以通过yum install tcl去安装

    [root@redis redis-3.0.6]# make test
cd src && make test
make[1]: Entering directory `/root/redis-3.0.6/src'
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] Error 1
make[1]: Leaving directory `/root/redis-3.0.6/src'
make: *** [test] Error 2

3.解决错误之后,我们就可以通过redis-server redis.conf去启动redis服务端了

[root@redis redis-3.0.6]# redis-server redis.conf
4624:M 20 Dec 11:56:53.375 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 4624
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-' 4624:M 20 Dec 11:56:53.376 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4624:M 20 Dec 11:56:53.376 # Server started, Redis version 3.0.6
4624:M 20 Dec 11:56:53.376 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
4624:M 20 Dec 11:56:53.376 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
4624:M 20 Dec 11:56:53.376 * The server is now ready to accept connections on port 6379

从上面的输出信息中,我们看到redis是运行在TCP的6379端口上的。

注意:默认的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新开一个终端。修改为yes则为>后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修改,默认log信息定向到stdout

4.redis的配置文件

redis.conf的主要配置参数的含义:

  • daemonize:是否以后台daemon方式运行,no为禁止,yes为运行

  • pidfile:pid文件位置

  • tcp-backlog(如果访问量非常大,接收缓冲已经满了,制定一个位置缓冲新请求,tcp协议一般会有backlog)

  • bind 监听地址,默认在127.0.0.1 我们可以指定多个地址,例如bind 127.0.0.1 10.0.1.243

  • port:监听的端口号,默认是6379,可以自己指定其他地址

  • unixsocket和unixsocketperm 定义sokcet的pid文件位置和权限如果你的服务器和redis在同一台服务器上推荐指定socket方式,给予socket的方式在内存中直接交换而不经过tcp协议栈去封装,

  • timeout:请求超时时间,0表示禁用

  • loglevel:log信息级别

  • logfile:log文件位置

  • databases:开启数据库的数量,在redis的集群中只支持0库

  • save * :保存快照的频率,第一个表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件,例如以下,表示900秒有1个键发生变化就执行写操作,如果在300秒内,有10个键发生变化就执行写操作,如果60秒有1000个键发生变化则执行写操作。

    save 900 1
    save 300 10
    save 60 10000
  • rdbcompression:是否使用压缩

  • dbfilename:数据快照文件名(只是文件名,不包括目录)

  • dir:数据快照的保存目录(这个是目录)

  • appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

  • appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

  • slaveof, 启动主从,需要指定iP和端口

使用redis客户端

1.我们修改redis的配置文件,将daemonize修改为yes,将bind打开,然后保存,执行如下操作

[root@redis redis-3.0.6]# redis-server /etc/redis.conf
[root@redis redis-3.0.6]# redis-cli
127.0.0.1:6379>

注意:默认redis-cli没有开启认证机制,所以直接redis-cli就可以进入redis命令行界面

2.redis的帮助系统,我们进入cli后,可以输入help查看帮助信息

127.0.0.1:6379> help
redis-cli 3.0.6
Type: "help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit

例如我们要查看String的相关参数可以使用help @String

127.0.0.1:6379> help @String

  APPEND key value
summary: Append a value to a key
since: 2.0.0 BITCOUNT key [start end]
summary: Count set bits in a string
since: 2.6.0
……

我们也可以使用help [tab]去tab一些选项

redis的常用命令

Strings的命

1.打开数据库(名称空间):SELE [num],最多打开16个

127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 2
OK

2.设置字符串

127.0.0.1:6379> help set

  SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string

3.设置key和value

127.0.0.1:6379> SET disto fedora
OK
127.0.0.1:6379> GET disto
"fedora"

4.键值在同一名称空间中必须唯一

127.0.0.1:6379> SET disto fedora
OK
127.0.0.1:6379> GET disto
"fedora"
127.0.0.1:6379> SET disto ubuntu
OK
127.0.0.1:6379> GET disto
"ubuntu"
127.0.0.1:6379>

5.设置自动增长的值

127.0.0.1:6379> SET count 0
OK
127.0.0.1:6379> INCR count
(integer) 1
127.0.0.1:6379> INCR count
(integer) 2
127.0.0.1:6379> INCR count
(integer) 3

6.设置自动减的值

127.0.0.1:6379> DECR count
(integer) 2
127.0.0.1:6379> DECR count
(integer) 1
127.0.0.1:6379> DECR count
(integer) 0
127.0.0.1:6379> DECR count
(integer) -1
127.0.0.1:6379> DECR count
(integer) -2

7.设置键的手动过期或自动过期时间

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX 过期时间 NX 如果一个键不存在才创建

127.0.0.1:6379> SET disto gento NX
(nil)

XX表示存在才创建

127.0.0.1:6379> SET foo bar XX
(nil)

8.set还支持integer,但是必须为整数

1)设置integer

127.0.0.1:6379> set foo 1
OK
127.0.0.1:6379> get foo
"1"

2)非integer会出现错误

127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> incr foo
(error) ERR value is not an integer or out of range
List的常用命令

1.获取list的帮助

127.0.0.1:6379> help @list

  BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0 BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0 BRPOPLPUSH source destination timeout
summary: Pop a value from a list, push it to another list and return it; or block until one is available
since: 2.2.0

2.定义一个list

127.0.0.1:6379> LPUSH l1 mon
(integer) 1

3.获取list的值

127.0.0.1:6379> LINDEX l1 0
"mon"
127.0.0.1:6379>

比如我们在给l1增加一个值

127.0.0.1:6379> LPUSH l1 sun
(integer) 2

那么,此时,我们通过LINDEX l1 0获取的就是新增加的sun,而LINDEX l1 1则是mon

127.0.0.1:6379> LINDEX l1 0
"sun"
127.0.0.1:6379> LINDEX l1 1
"mon"

那么,我们要想从右侧增加一个值呢?我们可以使用RPUSH去创建

127.0.0.1:6379> RPUSH l1 tue
(integer) 3
127.0.0.1:6379> LINDEX l1 2
"tue"

修改一个值

127.0.0.1:6379> LSET l1 1 fri
OK
127.0.0.1:6379> LINDEX l1 1
"fri"

要想从左侧弹出一个值用LPOP,要想从右侧则用RPOP

127.0.0.1:6379> RPOP l1
"tue"
127.0.0.1:6379> RPOP l1
"fri"
无序集合的操作

1.创建一个集合

127.0.0.1:6379> SADD w1 mon tue wed thu fre sat sun
(integer) 7
127.0.0.1:6379> SADD w2 tue thu day
(integer) 3

2.求交集

127.0.0.1:6379> SINTER w1 w2
1) "thu"
2) "tue"
127.0.0.1:6379>

2.求并集

127.0.0.1:6379> SUNION w1 w2
1) "thu"
2) "day"
3) "sun"
4) "tue"
5) "fre"
6) "wed"
7) "mon"
8) "sat"
127.0.0.1:6379>

3.弹出元素

127.0.0.1:6379> SPOP w1
"sun"

5.查看元素是否存在

127.0.0.1:6379> SISMEMBER w1 mon
(integer) 1
127.0.0.1:6379> SISMEMBER w1 fri
(integer) 0
有序集合操作
127.0.0.1:6379> HELP @SORTED_SET

1.添加元素到集合

127.0.0.1:6379> ZADD weekday1 1 mon 2 tue 3 wed
(integer) 3

2.获取元素的总数

127.0.0.1:6379> ZCARD weekday1
(integer) 3

3.查看索引号

127.0.0.1:6379> ZRANK weekday1 tue
(integer) 1

4.根据元素获取SCORE

127.0.0.1:6379> ZSCORE weekday1 mon
"1"

5.指明索引范围获取值

127.0.0.1:6379> ZRANGE weekday1 0 2
1) "mon"
2) "tue"
3) "wed"
Hashes的操作

1.添加/补充新值一个hashes

127.0.0.1:6379> HSET h1 a mon
(integer) 1

2.获取值

127.0.0.1:6379> HGET h1 a
"mon"

3.获取所有值

127.0.0.1:6379> HKEYS h1
1) "a"
2) "b"

4.获取元素总数

127.0.0.1:6379> HLEN h1
(integer) 2

5.删除键

127.0.0.1:6379> HDEL h1 a
(integer) 1
127.0.0.1:6379> HGET h1 a
(nil)

redis的简介和使用的更多相关文章

  1. Redis详解(一)------ redis的简介与安装

    工作中一直在用 Redis,但是一直没有进行系统的总结,这个系列的博客将整体的介绍 Redis 的用法. 1.Redis 的简介 Redis:REmote DIctionary Server(远程字典 ...

  2. Redis系列(一):Redis的简介与安装

    原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...

  3. [转]Redis 数据结构简介

    Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...

  4. Redis 详解 (一) redis的简介和安装

    目录 1.Redis 的简介 2.Redis 下载 3.安装环境 4.编译安装 5.启动Redis 6.关闭Redis 7.注意事项 工作中一直在用 Redis,但是一直没有进行系统的总结,这个系列的 ...

  5. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  6. Redis的简介与安装(windows)

    1.简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合).zset(sorte ...

  7. Redis的简介与安装

    1.简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  8. redis(一)简介

    啥也不说百度各种简介 推荐一个博客灰常详细的介绍  nosqlfan  接下来发布redis+USE_TCMALLOC 的安装配置,博客好多坑,找一篇好文真心难啊.  redis+keepalived ...

  9. redis cluster简介和配置(3)

    前面我介绍了 redis sentinel,既然有了sentinel,为什么还要一个cluster呢?因为随着业务量的增加,不可避免要对redis进行扩容,扩容方式一般由2种:1. 垂直扩容 2. 水 ...

  10. Redis的简介

    Redis 简介 Redis 是一个高性能的key-value数据库.支持复杂的数据结构,支持持久化,支持主从集群,支持高可用,支持较大的value存储... Redis是一个nosql,非关系型数据 ...

随机推荐

  1. js进阶 9-7 自动计算商品价值

    js进阶 9-7  自动计算商品价值 一.总结 一句话总结: 1.form表单控件value属性:属性可取值可赋值 2.文本onchange事件 3.form及form中控件通过name访问元素 二. ...

  2. 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)

     本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...

  3. 【codeforces 765A】Neverending competitions

    [题目链接]:http://codeforces.com/contest/765/problem/A [题意] 给你一个人的n个行程 行程都是从家到某个地方或从某个地方到家; 且是无序的,且如果到了非 ...

  4. Linux修改windows中文本文件出现的^M

    换行符的Linux与windows文本文件是不一致的,需要通过 :%s/^M$//g 其中^M的输入使用ctrl+v+m 可以删除^M

  5. Android Studio打包apk,aar,jar包

    转载请标明出处:一片枫叶的专栏 文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独 ...

  6. database disk image is malformed解决方法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在Hudson上终止一次Job的运行之后,Hudson在服务器上更新源码出现下图的错误: 查了下英文意思,大意是svn ...

  7. android中滑动SQLite数据库分页加载

    今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...

  8. [C#]Windows系统特殊文件夹路径获取

    原文:[C#]Windows系统特殊文件夹路径获取 由于软件开发的需要,近期对Windows特殊文件夹(如桌面,我的文档等)路径的查找方法进行了研究,结果如下. 获取特殊文件夹的方法不止一种,下面列出 ...

  9. 微信小程序之购物车

    这里演示从商品列表中添加到购物车 下面先做商品列表页.如下图: 布局分析: 首先一个list的主盒子,接着是item盒子,这是必须的.然后把item分成左侧的图片部分,和右侧的说明部分(item盒子使 ...

  10. 文章之间的基本总结Activity生命周期

    子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精 ...