概述
Redis是什么?
Redis是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是当下最热门的NoSQL技术之一,也被人们称之为结构化数据库
Redis能干嘛?
- 内存存储、持久化。内存是断电即失的、所以说持久化很重要(rdb、aof)
- 效率高,可以用于高速缓存
- 可用于发布订阅系统、地图信息分析、计时器、计数器、浏览量…
特性
多样的数据类型
-
持久化
-
集群
-
事务
…
性能测试
redis-benchmark 压力测试工具,官方自带的性能测试工具
简单测试:
# 测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
基础知识
redis默认有16个数据库,默认使用的是第0个
基本命令:
127.0.0.1:6379> select 1 # 切换数据库
OK
127.0.0.1:6379> DBSIZE # 查看DB大小
(integer) 1
127.0.0.1:6379> keys * # 查看数据库的所有key
1) "name"
127.0.0.1:6379> exists name # 判断当前key是否存在
(integer) 1
127.0.0.1:6379> type name # 查看当前key类型
string
127.0.0.1:6379> expire name 30 # 设置key的过期时间,单位:秒
(integer) 1
127.0.0.1:6379> ttl name # 获取当前key剩余的过期时间
(integer) 25
127.0.0.1:6379> ttl name
(integer) 9
127.0.0.1:6379> ttl name
(integer) -2 # 如果key不存在或者已过期,返回 -2 如果key存在并且没有设置过期时间(永久有效),返回 -1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> flushdb # 清除当前数据库的内容
OK
127.0.0.1:6379> flushall # 清除所有数据库的内容
OK
Redis是单线程的!
官方表示,Redis是 基于内存操作,CPU不是Redis性能瓶颈,Redis瓶颈是根据机器的内存和网络带宽而定;既然可以使用单线程来实现,那就使用单线程了!所以就使用了单线程
Redis 是C语言写的,官方提供的数据为 100000+ 的QPS,完全不比同样是使用 key-value 的memcached差
Redis 为什么单线程还那么快?
- 误区1:高性能的服务器一定是多线程的?
- 误区2:多线程一定比单线程效率高?
- 多线程:CPU上下文会切换,耗时的操作
Redis 是将所有的数据全部存放在内存中的,所以说使用单线程去操作效率就是最高的,对于内存系统来说,如果没有上下文切换效率就是最高的。多次读写都是在一个CUP上进行的,在内存情况下,这个就是最佳的方案!
redis 与 memcached 相比的独特之处:
- redis 可以用来做存储(storage),而 memcached 是用来做缓存(cache),这个特点主要是其有“持久化”的功能
- 存储的数据有“结构”,对于 memcached 来说存储的数据只有一种类型(字符串),而 redis 则可以存储字符串、链表、哈希、集合、有序集合
主要文件:
- redis-benchmark redis性能测试工具
- redis-check-aof 检查aof日志的工具
- redis-check-rdb 检查rbd日志的工具
- redis-cli 连接用的客户端
- redis-server redis 服务进程
- redis-sentinel 哨兵模式