redis(Remote Dictionary Server)
历史与发展:
2008年一家意大利创业公司创始人对mysql性能感到失望,于是为公司项目量身打造一行款内存数据库redis.知名用户群有:新浪博客,街旁,知乎,github,等。
存储结构:以字典结构存储数据。
Redis支持的键值数据类型有: 字符串类型,散列类型,列表类型,集合类型,有序集合类型。
内存存储与持久化: Redis数据库中所有数据都存储在内存中,可以在1秒内读写超过10万个键值。程序退出后内存中的数据会丢失,Radis提供对持久化的支持,内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
简单稳定:在Redis中使用命令读写数据,命令于Redis相当于SQL语句于关系数据库。Redis使用C语言开发,代码量只有3万多行。
安装Redis:Redis约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版本(如2.4版,2.6版),为奇数的是非稳定版本。
windows下安装Redis:下载地址,下载解压到安装路径,然后在命令行切换到根安装包根路径,输入:redis-server.exe redis.conf 验证redis是否安装成功。
出现下面即说明redis服务端已安装成功:
启动Redis: $redis-server
Redis服务器默认使用6379端口,自定义端口号:$redis-server --port 6388
停止Redis: $redis-cli SHUTDOWN 先断开所有客户端连接,然后配置执行持久化操作,最后退出。效果与直接关闭redis进程PID一样。
命令返回值:1.状态回复,2.错误回复,3.整数回复,4,字符串回复,5.多行字符串回复,
多数据库:Redis默认支持16个数据库, 每个数据库对外都是以一个从0开始的数据库命名,客户端与Redis建立连接后会自动选择0号数据库。Redis不支持自定义数据库名,每个数据库都以编号命名,不支持为每个数据库单独设置密码。Redis非常轻量级,一个空Redis实例占用内存只有1M左右。
获得符合规则的键名列表:KEYS pattern
获取Redis中所有的键:KEYS *
判断一个键是否存在: EXISTS key,存在返回1,不存在返回 0.
删除键:DEL key[key....]
获得键值的数据类型:TYPE key
--------------------------------------------------------------------------
字符串类型:
一个字符串类型的键允许存储的数据的最大容量是512M.
赋值与取值
SET key value
GET key
如:key="hello"在Redis中表示为 redis>SET key hello
2. 递增数字
INCR key
让当前键值递增。
增加指定的整数:INCRBY key increment. INCR 和INCRBY命令基本一样。INCRBY指定一次增加的数值.
3.递减数字
DECR key
让当前键值递减。
递减指定整数:DECRBY key. DECRBY key decrement.
4.增加指定浮点数
INCRBYFLOAT key increment
5.向尾部追加值
APPEND key value
6.获取字符串长度
STRLEN key.
7.同时获得/设置多个键值
MGET key [key …]
MSET key value [key value …]
8.位操作
GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP operation destkey key [key …]
-----------------------------------------------------------------------------------
散列类型:
散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。
1.赋值与取值
HSET key field value
HGET key field
HMSET key field value [field value …]
HMGET key field [field …]
HGETALL key
2.判断字段是否存在
HEXISTS key field
3.当字段不存在时赋值
HSETNX key field value
4.增加数字
HINCRBY key field increment
5.删除字段
HDEL key field [field …]
命令:
1.只获取字段名或字段值
HKEYS key
HVALS key
2.获得字段数量
HLEN key
-------------------------------------------------------------------------------
列表类型:
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
命令:
1.向列表两端增加元素
LPUSH key value [value …]
RPUSH key value [value …]
2.从列表两端弹出元素
LPOP key
RPOP key
3.获取列表中元素的个数
LLEN key
4.获得列表片段
LRANGE key start stop
5.删除列表中指定的值
LREM key count value
命令:
1.获得/设置指定索引的元素值
LINDEX key index
LSET key index value
2.只保留列表指定片段
LTRIM key start end
3.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
4.将元素从一个列表转到另一个列表R
POPLPUSH source destination
------------------------------------------------------------------------------------
集合类型:
集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是0(1)。
命令:
1.增加/删除元素
SADD key member [member …]
SREM key member [member …]
2.获得集合中的所有元素
SMEMBERS key
SMEMBERS命令会返回集合中的所有元素。
3.判断元素是否在集合中
SISMEMBER key member
4.集合间运算
SDIFF key [key …]
SINTER key [key …]
SUNION key [key …]
命令:
1.获得集合中元素个数
SCARD key
2.进行集合运算并将结果存储
SDIFFSTORE destination key [key …]
SINTERSTORE destination key [key …]
SUNIONSTORE destination key [key …]
3.随机获得集合中的元素
SRANDMEMBER key [count]
4.从集合中弹出一个元素
SPOP key
-----------------------------------------------------------------------------------
有序集合类型:
有序集合类型在某些方面和列表类型有些相似。
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的。
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问
中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的
应用。
命令:
1.增加元素
ZADD key score member [score member …]
2.获得元素的分数
ZSCORE key member
3.获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
4.获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
命令:
1.获得集合中元素的数量
ZCARD key
2.获得指定分数范围內的元素个数
ZCOUNT key min max
3.删除一个或多个元素
ZREM key member [member …]
4.按照排名范围删除元素
ZREMRANGEBYRANK key start stop
5.按照分数范围删除元素
ZREMRANGEBYSCORE key min max
6.获得元素的排名
ZRANK key member
ZREVRANK key member
7.计算有序集合的交集
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]]
[AGREGATE SUM|MIN|MAX]
----------------------------------------------------------------------------------------
实现缓存:
为了提高网站的负载能力,常常需要将一些访问频率较高但是对CPU或IO资源消耗较大的操作的结果缓存起来,并希望让这些缓存过一段时间自动过期。
可以通过给键设置生存时间的方式实现。每次用
户访问首页时程序先查询缓存键是否存在,如果存在则直接使用缓存的值;否则重新计算排名
并将计算结果赋值给该键并同时设置该键的生存时间为两个小时。
---------------------------------------------------------------------------------------
节省空间:
精简键名和键值。
内部编码优化。
------------------------------------------------------------------------------------------
Lua语言:
Lua是一个高效的轻量级脚本语言。Lua在葡萄牙语中是“月亮”的意思,它的徽标形似卫星,寓意着Lua是一个“卫星语言”,能够方便地嵌入到其他语言中使用。
-----------------------------------------------------------------------------------------
KEYS 与ARGV:
向脚本传递的参数分为KEYS和ARGV两类,前者表示要操作的键名,后者表 示非键名参数。
-----------------------------------------------------------------------------------------------
持久化:
Redis的强劲性能很大程度上是由于其将所有数据都存储在了内存中,为了使Redis在重
启之后仍能保证数据不丢失,需要将数据从内存中以某种形式同步到硬盘中,这一过程就是
持久化。
Redis支持两种方式的持久化,一种是RDB方式(快照方式),一种是AOF方式。可以单独使用其中一
种或将二者结合使用。
---------------------------------------------------------------------------------------------------