数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

关于使用key/value数据库redis和TTSERVER的心得体会


发布日期:2019年03月11日
 
关于使用key/value数据库redis和TTSERVER的心得体会
本篇文章是对使用key/value数据库redis和TTSERVER的心得体会进行了详细的分析介绍需要的朋友参考下

先说redis
redis是一个类似memcached的key/value存储系统它支持存储的 value类型相对较多包括string(字符串) list(链表)set(集合)和zset(有序集合)在此基础上redis支持各种不同方式的排序与memcached一样为了保证效率数 据都是缓存在内存中区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件(这点儿个人觉得redis比memcache 在数据保存上要安全一些)并且在此基础上实现了master slave(主从)同步

redis的存取性能很高SET操作每秒钟 GET操作每秒钟 次(速度很爽!)
Redis针对不同的存储类型对象提供了不同的命令
redis目前提供四种数据类型stringlistset及zset(sorted set)
string是最简单的类型你可以理解成与Memcached一模一个的类型一个key对应一个value其上支持的操作与Memcached的操 作类似但它的功能更丰富

list是一个链表结构主要功能是pushpop获取一个范围的所有值等等操作中key理解为链表的名字
set是集合和我们数学中的集合概念相似对集合的操作有添加删除元素有对多个集合求交并差等操作操作中key理解为集合的名字

zset是set的一个升级版本他在set的基础上增加了一个顺序属性这一属性在添加修改元素的时候可以指定每次指定后zset会自动重新按新的 值调整顺序可以理解了有两列的mysql表一列存value一列存顺序操作中key理解为zset的名字

下面提供redis命令
适合全体类型的命令
EXISTS key 判断一个键是否存在;存在返回 ;否则返回;
DEL key 删除某个key或是一系列key;DEL key key key key
TYPE key 返回某个key元素的数据类型 ( none:不存在string:字符listsetzsethash)
KEYS pattern 返回匹配的key列表 (KEYS foo*:查找foo开头的keys)
RANDOMKEY 随机获得一个已经存在的key如果当前数据库为空则返回空字符串
RENAME oldname newname更改key的名字新键如果存在将被覆盖
RENAMENX oldname newname 更改key的名字如果名字存在则更改失败
DBSIZE返回当前数据库的key的总数
EXPIRE设置某个key的过期时间(秒)(EXPIRE bruce 设置bruce这个key秒后系统自动删除)注如果在还没有过期的时候对值进行了改变那么那个值会被清除
TTL查找某个key还有多长时间过期返回时间秒
SELECT index 选择数据库
MOVE key dbindex 将指定键从当前数据库移到目标数据库 dbindex成功返回 ;否则返回(源数据库不存在key或目标数据库已存在同名key);
FLUSHDB 清空当前数据库中的所有键
FLUSHALL 清空所有数据库中的所有键

处理字符串的命令
SET key value 给一个键设置字符串值SET keyname datalength data (SET bruce paitoubing:保存key为burce字符串长度为的一个字符串paitoubing到数据库)data最大不可超过G
GET key获取某个key 的value值如key不存在则返回字符串“nil”如key的值不为字符串类型则返回一个错误

GETSET key value可以理解成获得的key的值然后SET这个值更加方便的操作 (SET bruce paitoubing这个时候需要修改bruce变成并获取这个以前的数据paitoubingGETSET bruce )
MGET key key … keyN 一次性返回多个键的值

SETNX key value SETNX与SET的区别是SET可以创建与更新key的value而SETNX是如果key不存在则创建key与value数据
MSET key value key value … keyN valueN 在一次原子操作下一次性设置多个键和值
MSETNX key value key value … keyN valueN 在一次原子操作下一次性设置多个键和值(目标键不存在情况下如果有一个以上的key已存在则失败)
INCR key 自增键值
INCRBY key integer 令键值自增指定数值
DECR key 自减键值
DECRBY key integer 令键值自减指定数值

处理 lists 的命令
RPUSH key value 从 List 尾部添加一个元素(如序列不存在则先创建如已存在同名Key而非序列则返回错误)
LPUSH key value 从 List 头部添加一个元素
LLEN key 返回一个 List 的长度
LRANGE key start end从自定的范围内返回序列的元素 (LRANGE testlist ;返回序列testlist前 元素)
LTRIM key start end修剪某个范围之外的数据 (LTRIM testlist ;保留 元素其余的删除)
LINDEX key index返回某个位置的序列值(LINDEX testlist ;返回序列testlist位置为的元素)
LSET key index value更新某个位置元素的值
LREM key count value 从 List 的头部(count正数)或尾部(count负数)删除一定数量(count)匹配value的元素返回删除的元素数量
LPOP key 弹出 List 的第一个元素
RPOP key 弹出 List 的最后一个元素
RPOPLPUSH srckey dstkey 弹出 _srckey_ 中最后一个元素并将其压入 _dstkey_头部key不存在或序列为空则返回“nil”

处理集合(sets)的命令(有索引无序序列)
SADD key member增加元素到SETS序列如果元素(membe)不存在则添加成功 否则失败 ;(SADD testlist /n one)
SREM key member 删除SETS序列的某个元素如果元素不存在则失败否则成功 (SREM testlist /N one)
SPOP key 从集合中随机弹出一个成员
SMOVE srckey dstkey member 把一个SETS序列的某个元素 移动到 另外一个SETS序列 (SMOVE testlist test /n two;从序列testlist移动元素two到 test中testlist中将不存在two元素)
SCARD key 统计某个SETS的序列的元素数量
SISMEMBER key member 获知指定成员是否存在于集合中
SINTER key key … keyN 返回 key key keyN 中的交集
SINTERSTORE dstkey key key … keyN 将 key key keyN 中的交集存入 dstkey
SUNION key key … keyN 返回 key key keyN 的并集
SUNIONSTORE dstkey key key … keyN 将 key key keyN 的并集存入 dstkey
SDIFF key key … keyN 依据 key keyN 求 key 的差集官方例子
key = xabc
key = c
key = ad
SDIFF keykeykey => xb
SDIFFSTORE dstkey key key … keyN 依据 key keyN 求 key 的差集并存入 dstkey
SMEMBERS key 返回某个序列的所有元素
SRANDMEMBER key 随机返回某个序列的元素

处理有序集合(sorted sets)的命令 (zsets)
ZADD key score member 添加指定成员到有序集合中如果目标存在则更新score(分值排序用)
ZREM key member 从有序集合删除指定成员
ZINCRBY key increment member 如果成员存在则将其增加_increment_否则将设置一个score为_increment_的成员
ZRANGE key start end 返回升序排序后的指定范围的成员
ZREVRANGE key start end 返回降序排序后的指定范围的成员
ZRANGEBYSCORE key min max 返回所有符合score >= min和score <= max的成员 ZCARD key 返回有序集合的元素数量 ZSCORE key element 返回指定成员的SCORE值 ZREMRANGEBYSCORE key min max 删除符合 score >= min 和 score <= max 条件的所有成员

使用体会
个人在觉得 redis速度是不用说了(很快的)但是很消耗物理内存算是redis的一个弊端吧redis适合数据量比较小速度更新快的类型的网站比如社区 不适合数据比较庞大的网站比如论坛以前用redis应用的一个论坛帖子上但是因为数据量太大消耗物理内存惊人而放弃了用 redis!

再说说TTSERVER
Tokyo Cabinet 是一个DBM的实现这里的数据库由一系列keyvalue对的记录构成key和value都可以是任意长度的字节序列既可以是二进制也可以是字符 串这里没有数据类型和数据表的概念当做为Hash表数据库使用时每个key必须是不同的因此无法存储两个key相同的值提供了以下访问方法:提 供keyvalue参数来存储按 key删除记录按key来读取记录另外遍历key也被支持虽然顺序是任意的不能被保证这些方法跟Unix标准的DBM例如GDBMNDBM 等等是相同的但是比它们的性能要好得多(因此可以替代它们) 当按B+树来存储时拥用相同key的记录也能被存储像hash表一样的读取存储删除函数也都有提供记录按照用户提供的比较函数来存储可以采用 顺序或倒序的游标来读取每一条记录依照这个原理向前的字符串匹配搜索和整数区间搜索也实现了另外B+树的事务也是可用的对于定长的数组记录按 自然数来标记存储不能存储key相同的两条或更多记录另外每条记录的长度受到限 制读取方法和hash表的一样 Tokyo Cabinet是用C写的同时提供cperlrubyjava的APITokyo Cabinet在提供了POSIX和C的平台上都可用它以GNU Lesser Public License协议发布

tokyocabinet :一个keyvalue的DBM数据库但是没有提供网络接口以下称TC
tokyotyrant :是为TC写的网络接口他支持memcache协议也可以通过HTTP操作以下称TT

性能:
Tokyo Cabinet 是日本人 平林干雄 开发的一款 DBM 数据库Tokyo Cabinet基于GNU Lesser General Public License协议发布采用C语言开发它可以运行在任何支持C和POSIX平台上使用相比一般的DBM数据库有以下几个特点空间小效率高 性能高可靠性高多种开发语言的支持(现已提供CPerlRubyJavaLua的API)支持位操作系统该数据库读写非常快哈希模 式写入万条数据只需读取万条数据只需是 Berkeley DB 等 DBM 的几倍

Tokyo Tyrant 加上 Tokyo Cabinet构成了一款支持高并发的分布式持久存储系统对任何原有Memcached客户端来讲可以将Tokyo Tyrant看成是一个Memcached但是它的数据是可以持久存储的这一点跟新浪的Memcachedb性质一样

ttserver和memcache比较
ttserver 是数据库memcached是缓存两者都是保存<keyvalue>形式的数据通过key进行任何操作ttserver可以将数据 持久化保存memcached全部是保存在内存中memcached会自动删除过期数据最长不超过memcached在和一些api配合 时能自动进行数据的出入序列化读取反序列化ttserver有主从复制的功能操作日志等这完全是数据库才有的东西据说memcached正在 对整体架构做调整到时候支持plugin机制会把网络事件处理内存存储剥离开来以后要做基于磁盘的keyvalue存储就可以写一个存储引擎 就成了memcached的二次开发又步入一个小高潮

上一篇:编写Smarty插件在模板中直接加载数据的详细介绍

下一篇:PHP链接ACCESS数据库最简单的方法