Redis学习笔记:Redis简介
一、nosql和关系型数据库区别
nosql非关系型数据库:redis、mongodb、hbase等,基于key-value存储,采用命令操作。
关系型数据库:oracle、mysql、db2、sql server等,基于表结构存储,采用sql操作。
二、redis简介
redis是由意大利人salvatore sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。redis全称为: remote dictionary server(远程数据服
务),该软件使用c语言编写,是典型的nosql数据库服务器。redis是一个key-value存储系统,它支持丰富的数据类型,如string、hash、list、set、
zset(sorted set)。
三、redis特点
优点:
- 性能极高:redis能支持每秒10万读写频率。
- 支持丰富的数据类型:包括string、hash、list、set、zset(sorted set)等多种数据类型。
- 原子性:所有操作都是原子性的(一起成功,或者一起失败)。
- 支持持久化操作:将内存数据同步到数据文件中。
- 提供了事务、消息传递等功能。
缺点:
- 由于是内存数据库,所以单台机器存储的数据量,取决于机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估及节约
内存,如果内存增长过快,需要定期删除数据。
- 如果进行完整重同步,由于需要生成rdb文件并进行传输,因此会占用主机的cpu并会消耗网络的带宽。虽然redis 2.8版本已经有部分重同步的
功能,但是还是有可能完整重同步的,比如新上线的备机。
- 修改配置文件后,重启将硬盘中的数据加载到内存时,时间比较久。在这个过程中,redis不能提供服务。
备注:
在系统中,通常使用redis做数据缓存使用。
查询缓存:第一次查询时会从数据库中取出数据放入缓存,后续查询都将从缓存中读取数据。
添加/更新缓存:将用户数据通过检测后放入缓存,然后给用户响应,后台开启线程取数据处理。
四、redis常用数据类型
redis常用的数据类型有5种,即string、hash、list、set、zset(sorted set):
string--字符串
string是简单的key-value 类型,value不仅可以是string,也可以是数字(当数字类型用long可以表示的时候encoding就是整型,其它都存储在
sdshdr当做字符串),在list、set和zset中包含的独立的元素类型都是redis string类型。string类型的value最大为512mb。
hash--字典
hash是最接近关系型数据库结构的数据类型,可以将数据库中一条记录或程序中一个对象转换成hashmap存放在redis中。在memcached中,我们
经常将一些结构化的信息打包成hashmap,然后在客户端序列化后存储为一个字符串的值 (一般是json格式),比如用户的昵称、年龄、性别等。
hash的键值对个数最多为2^32-1(4294967295)个。
list--列表
list说白了就是链表类型(双端链表),主要功能是push、pop、获取一个范围的所有值等,其中的key可以理解为链表的名字。在redis中,list就
是redis string的列表,按照插入顺序进行排序,比如使用lpush命令在list头插入一个元素、使用rpush命令在list尾插入一个元素。当这两个命令
之一作用于一个空的key时,一个新的list就创建出来了。list的元素个数最多为2^32-1(4294967295)个。
set--集合
set就是一个集合,集合的概念就是一堆不重复值的组合。利用redis提供的set数据结构,可以存储一些集合性的数据。在redis中,set就是redis
string的无序集合,不允许有重复元素,对set的操作有交集、并集、差集等。set的元素个数最多为2^32-1(4294967295)个。
zset(sorted set)--有序集合
和set相比,sorted set是将set中的元素增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,对于已经有序的zset,仍然可以
使用sort命令,通过指定asc|desc参数对其进行排序。zset的元素个数最多为2^32-1(4294967295)个。
五、redis操作命令
5.1、字符串操作
set key value //设置value值 get key //获取value值 strlen key //获取value长度 incr key //将value加1 incrby key i //将value加i decr key //将value减1 decrby key i //将value减i append key value //将原有key的值拼接上value值
5.2、哈希操作
hset key 字段名 字段值 //设置一组 hmset key 字段名 字段值 字段名 字段值 //设置多组 hget key 字段名 //获取一个字段值 hmget key 字段名1 字段名2 //获取多个字段值 hlen key //获取字段数量 hkeys key //查看字段名 hdel key 字段名 //删除字段名
5.3、列表操作
lpush key value //从头部放入值(key列表存在插入,不存在创建列表插入) rpush key value //从尾部放入值 lpop key //从头部删除一个元素 rpop key //从尾部删除一个元素 lrem key count value //删除多少个值等于value的元素 lindex key index //获取index位置的value值 lrange key start end //获取指定范围的元素 linsert key before|after 元素 要插入的值 //插入元素 lset key index value //更新index位置的value值 llen key //获取列表元素数
5.4、集合操作
sadd key value value //向集合添加元素 srem key value //删除value元素 scard key //获取集合元素数量 smembers key //查看所有元素 srandmember key count //获取count个随机数 sinter key1 key2 //两个集合交集,key1和key2都有 sunion key1 key2 //两个集合并集,去重复合并 sdiff key1 key2 //差集,key1有,key2没有
5.5、有序集合
zadd key score value //向集合添加元素 zrem key value //删除元素 zcard key //元素数量 zrange key start end //获取指定范围的元素(小到大) zrevrange key start end //获取指定范围的元素(大到小) zrevrank key value //获取value索引(大到小) zrank key value //获取value索引(小到大)
5.6、key操作
keys pattern //查看key del key //删除key expire key time //设置有效时间(秒) type key //判断value值类型 rename key newkey //修改key名称
六、redis文件格式
redis使用了两种文件格式:全量数据和增量请求。
全量数据:是把内存中的数据写入磁盘,便于下次读取文件时进行加载。
增量请求:是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括set、rpush、sadd、zadd。
备注:redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
七、redis应用场景
(1)会话缓存(session cache)
(2)全页缓存(fpc)
(3)队列
(4)排行榜/计数器
(5)发布/订阅
参考自: