memcache和redis的区别
——memcache和memcached的区别:
memcache是项目的名称,
memcached是memcache服务器端可以执行文件的名称
——memcache的基本命令:
get 获取一个指定key的值
set 如果一个不存在则添加 如果存在则更新(重新赋值) 是add方法和replace 方法的结合体。
delete 删除一个key
add 添加一个key
replace 更新(update)
prepend在一个值的前面追加
stats查看memcache的状态
flush_all 清空memcache里面的所有数据
——Redis
key-value存储系统 nosql数据存储
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。而Memcached只支持字符串。
Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE
redis是一个内存数据库,通常可以作为缓存使用,常用的命令有:
结构类型 结构存储的值 结构的读写能力
String字符串 字符串,整数,浮点数。 对整个字符串或其中部分进行操作,对整数,浮点数执行自增或自减操作
List列表 一个链表,每个节点都包含一个字符串 从链表两端进行push和pop操作元素,根据偏移量对链表进行修剪,
读取单个或多个元素,根据值找或者删除元素
Set集合 包含字符串的不需要收集器, 添加,获取,删除单个元素。检查一个元素是否存在于集合之中。
被包含的每个字符串都是不一样的 计算交集,并集,差集。从集合里随机获取元素。
Hash散列 包含键值对的无序散列表 添加,获取,删除单个元素。获取所有键值对元素
Zset有序集合 字符串成员与浮点数分值之间的有序映射, 添加,获取,删除单个元素。根据分值范围或者成员取元素
元素排列顺序由分值的大小决定
String字符串类型
一个String类型的实例,其中键为hello,值为world:
(1)常用命令如下:
get:获取存储在给定键中的值 get key 获取指定key的值
set:设置存储在给定键中的值 set key value设置key的值
del:删除存储在给定键中的值
(2)Redis中的自增命令和自减命令:
incr:将键存储的值加一
decr:将键存储的值减一
incrby:将键存储的值加上整数amount
decrby:将键存储的值减去整数amount
incybyfloat:将键存储的值加上浮点数amount
(3)除了get、set、del、自增、自减等操作外,Redis还提供了下面一些操作:
1、获取字符串长度
2、往字符串append内容
3、设置和获取字符串的某一段内容
4、设置及获取字符串的某一位(bit)
5、批量设置一系列字符串的内容
append:将值value追加到给定键key当前存储的值末尾
getrange:获取一个由偏移量start至end范围内所有字符串组成的子串,包含start和end在内 getrange key start end 返回key中字符串值的子字符
setrange:将从start偏移量开始的子串设置为给定值
getset key value:将key的值设置为value,并返回key的旧值(old value)
getbit:将字符串看成是二进制位串,并返回位串中偏移量为offset的二进制的值
setbit:将字符串看成是二进制位串,并将位中偏移量为offset的二进制位的值设置为value
bitcount:统计二进制位串里面值位1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计
(4)应用场景:
String是最常用的一种数据类型,普通的key/value
存储都可以归为此类,value其实不仅是String, 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY
命令让这些变得很容易,通过原子递增保持计数。
List列表类型
Redis中的List其实就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。
使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 PUSH
操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。
一个List类型的实例,列表包含的元素,相同元素可以重复出现:
需要注意的是:一个List结构可以有序的存储多个字符串,并且是允许元素重复的。
(1)常用命令如下:
rpush:将给定的值推入到列表的右端
lpush:将给定的值推入到列表的左端
rpop:从列表的右端弹出一个值,并返回被弹出的值
lpop:从列表的左端弹出一个值,并返回被弹出的值
lrange:获取列表在给定范围上所有的值
lindex:获取列表在给定位置上的单个元素
LPUSH和RPUSH命令分别用于将元素推入列表的左端和右端;LPOP和RPOP命令分别用于从列表的左端和右端弹出元素,也就是删除元素;
(3)使用场景:
- 微博 TimeLine
- 消息队列
Set集合类型
Redis的集合和列表都可以存储多个字符串,他们的不同支持在于,列表可以存储多个相同的字符串,而集合通过使用散列表来保证自己存储的每个字符串都是各不相同的。
Redis的集合使用的是无序的方式存储元素,所以不可以像List列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。
(1)常用命令如下:
sadd:将给定元素添加到集合
smembers:返回集合包含的所有元素。
sismembers:检查给定元素是否存在于集合之中。
srem:如果给定的元素存在于集合之中,那么移除这个元素
(2)除了常见的命令之外,还有交集、并集、差集的计算,如下:
scard:返回集合包含元素的数量
srandmember:从集合中随机返回一个或多个元素,当count为正数时,命令返回的随机元素不会重复,当count为负数时,命令返回的随机元素可能会重复。
stop:随机的移除集合中的一个元素,并返回这个元素
smove:如果集合source-key包含元素item,那么就从集合中移除该元素item。并将元素item添加到几个dest-key中,如果item被成功移除,那么命令返回1,否则返回0.
sdiff:返回那些存在于第一个集合,但不存在于其他集合中的元素,就是数学中的差集运算。
sinter:返回那些同时存在于所有集合的元素,数学中的交集运算
sunion:返回那些至少存在于一个集合中的元素,数学中的并集运算。
sdiffstore:在sdiff的基础上将获得元素放到dest-key键里边
sinterstore:在sinter的基础上将获得元素放到dest-key键里边
sunionstore:在sunion的基础上将获得元素放到dest-key键里边
(3)使用场景:
- 共同好友、二度好友
- 利用唯一性,可以统计访问网站的所有独立 IP
- 好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
Hash散列类型
Redis的散列可以存储多个键值对之间的映射。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字执行自增操作或者是自减操作。
一个List散列类型的实例,是一个包含两个键值对的散列键:
(1)常用命令如下:
hset:在散列里面关联起给定的键值对
hget:获取指定散列键的值
hgetall:获取散列包含的所有的键值对
hdel:如果给定键存在于散列之中,那么久移除这个键。
(2)其他命令包含添加和删除键值对的命令、获取所有键值对的命令、以及对键值对的值进行自增和自减操作的命令,如下所示:
hmset:为散列里面的一个或多个键设置值
hmget:从散列里面获取一个或多个键的值
hlen:返回散列包含的键值对数量
hdel:删除散列里面的一个或多个键值对,返回成功找到并删除的键值对数量
Redis的有序集合ZSet数据类型
有序集合和散列一样,用于存储键值对;有序集合的键被称为成员member,每一个成员都是独一无二的;而有序集合的值被称为分值score,分值必须是浮点数。
有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排序来访问元素的结构。
一个有序集合类型的实例,zset-key是一个包含两个元素的有序集合键:
(1)常用命令如下:
zadd:将一个带有给定分值的成员添加到有序集合里面
zrange:根据元素在有序集合中所处的位置,从有序集合中获取多个元素。
zrangebyscore:获取有序集合在给定分值范围内的所有元素
zrem:如果给定元素成员存在与有序集合中,那么就移除这个元素.
redis和memecache的不同在于:
1、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。redis主从复制(多个机器同步) 重启后数据不会丢失,重启后再次加载使用。
redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化,即master-slave模式的数据备份。
2、数据支持类型:
redis在数据支持上要比memecache多的多。提供list,set,hash,zset,string等数据结构的存储
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。