-
定义
redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。 -
为什么使用
- 可以很好解决应用服务器的cpu和内存压力
- 减少io的读操作,减轻io的压力
- 关系型数据库的扩展性不强,难以改变表结构
- nosql数据库没有关联关系,数据结构简单,拓展表比较容易
- nosql读取速度快,对较大数据处理快
- 适用场景
- 数据高并发的读写
- 海量数据的读写
- 对扩展性要求高的数据
- 不适用场景
- 需要事务支持(非关系型数据库)
- 基于sql结构化查询储存,关系复杂
-
支持的数据类型
Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。
1> string(字符串)
它是redis的最基本的数据类型,一个键对应一个值,需要注意是一个键值最大存储512MB。
2> hash(哈希)
redis hash是一个键值对的集合,是一个string类型的field和value的映射表,适合用于存储对象
3> list(列表)
是redis的简单的字符串列表,它按插入顺序排序
4> set(集合)
是字符串类型的无序集合,也不可重复
5> zset(sorted set有序集合)
是string类型的有序集合,也不可重复
有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序,如果多个元素有相同的分数,则以字典序进行升序排序,sorted set因此非常适合实现排名 -
常用命令
- 启动命令:
本地启动:redis-cli
远程启动:redis-cli -h host -p port -a password - 连接命令
AUTH password ------ 验证密码是否正确
ECHO message ------ 打印字符串
PING ------ 查看服务是否运行
QUIT ------ 关闭当前连接
SELECT index ------ 切换到指定的数据库 - keys 命令
1. DUMP key ------ 序列化给定的key并返回序列化的值
2. EXISTS < key> ------ 判断key是否存在,存在返回1,不存在返回0
3. EXPIRE < key> < seconds> ------ 设置key过期时间为seconds,存在设置过期秒数后返回1,不存在key返回0
4. EXPIRE < key> < timestamp> ------ 用时间戳的方式给key设置过期时间
5. MOVE key db ------ 将当前数据库的key移动到数据库db当中
6. TTL < key> ------ 以秒为单位,返回给定 key 的剩余生存时间,剩余时间为0时,key就不可用
7. PTTL < key> ------ 以毫秒为单位,返回给定key的剩余生存时间
8. PERSIST < key> ------ 移除 key 的过期时间,key 将持久保持
9. KEYS pattern ------ 返回符合pattern模式的key,例如返回test开头的key,keys test* - 字符串命令
1. SET key value
2. GET < key> ------ 获取缓存,如果存在返回key对应的值,不存在返回nil
3. GETRANGE key start end ------ 返回key中字符串值的子字符
4. GETSET key value ------ 将给定key的值设为value,并返回key的旧值
5. GETBIT KEY OFFSET ------ 对key所储存的字符串值,获取指定偏移量上的位
6. MGET KEY1 KEY2 ------ 获取一个或者多个给定key的值
7. SETBIT KEY OFFSET VALUE ------ 对key所是存储的字符串值,设置或清除指定偏移量上的位
8. SETEX key seconds value ------ 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9. SETNX key value ------ 只有在 key 不存在时设置 key 的值。
10. SETRANGE key offset value ------ 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11. STRLEN key ------ 返回 key 所储存的字符串值的长度。
12. MSET key value [key value …] ------ 同时设置一个或多个 key-value 对。
13. MSETNX key value [key value …] ------ 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14. PSETEX key milliseconds value ------ 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15. INCR key ------ 将 key 中储存的数字值增一。
16. INCRBY key increment ------ 将 key 所储存的值加上给定的增量值(increment) 。
17. INCRBYFLOAT key increment ------ 将 key 所储存的值加上给定的浮点增量值(increment) 。
18. DECR key ------ 将 key 中储存的数字值减一。
19. DECRBY key decrement ------ key 所储存的值减去给定的减量值(decrement) 。
20. APPEND key value ------ 如果 key 已经存在并且是一个字符串, APPEND 命令将 指定value 追加到改 key 原来的值(value)的末尾。
待补充 - hash命令
- list命令
- set命令
- zset命令
- 持久化
1. 两种方式:rdb(redis database)和aof(append of file)
2. RDB:在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中
①持久化过程:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比aof高效,但是最后一次数据可能会丢失
②Fork:在linux中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程
③Redis备份的文件:在redis.conf中设置,dbfilename默认为:dump.rdb
- Redis的并发竞争问题如何解决?
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:
1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
2.服务器角度,利用setnx实现锁。
注:对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。