- 浏览: 56819 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
chiqinghaichi:
楼主好!菜鸟一枚,试了下你的程序,当访问 http://loc ...
SpringMVC -
随意而生:
复习复习 不错
SpringMVC -
ccii:
cylboke 写道他的意思是“orcle”写错了吧?我猜的! ...
Oracle基本操作 -
happy200318:
给个赞,不错
SpringMVC -
cylboke:
他的意思是“orcle”写错了吧?我猜的!!!
Oracle基本操作
1. 简介
redis是一个开源的key-value数据库。它又经常被认为是一个数据结构服务器。因为它的value不仅包括基本的string类型还有 list,set ,sorted set和hash类型。当然这些类型的元素也都是string类型。也就是说list,set这些集合类型也只能包含string 类型。你可以在这些类型上做很多原子性的操作。比如对一个字符value追加字符串(APPEND命令)。加加或者减减一个数字字符串(INCR命令,当然是按整数处理的).可以对list类型进行push,或者pop元素操作(可以模拟栈和队列)。对于set类型可以进行一些集合相关操作 (intersection union difference)。memcache也有类似与++,--的命令。不过memcache的 value只包括string类型。远没有redis的value类型丰富。和memcache一样为了性能,redis的数据通常都是放到内存中的。当然 redis可以每间隔一定时间将内存中数据写入到磁盘以防止数据丢失。
redis也支持主从复制机制(master-slave replication)。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数 据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。redis的其他特性包括简单的事务支持和发布订阅(pub/sub)通道功能,而且redis配置管理非常简单。还有各种语言版本的开源客户端类库。
官方的bench-mark(基准)数据如下:
测试完成了50个并发执行100000个请求,设置和获取的值是一个256字节字符串,Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz,文本执行使用loopback接口(127.0.0.1),结果:读的速度是110000次/s,写的速度是81000次/s 。
2. 安装
下载地址:http://www.redis.cn/download.html ,目前的最新稳定版是2.8.13。
可以在linux下运行如下命令进行安装:
$ tar xzf redis-2.8.13.tar.gz
$ cd redis-2.8.13
$ make
make完后 redis-2.8.13目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli等文件。下面启动redis服务:
$ ./redis-server // 注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动:
$ ./redis-server redis.conf // redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了,如下:
$ ./redis-cli
> set name jiang // name是key ,jiang是个string类型的value
OK
> get name // 得到name的value
"jiang"
3. keys
首先key也是字符串类型,但是key中不能包括边界字符。另外关于key的一个格式约定介绍下,object-type:id:field。比如user:1000:password,blog:xxidxx:title,还有key的长度最好不要太长。道理很明显占内存啊,而且查找时候相对短key也更慢。不过也不推荐过短的key,比如u:1000:pwd,这样的。显然没上面的user:1000:password可读性好。
下面介绍下key相关的公用命令:
> exists key //判断一个键是否存在
> keys pattern //返回指定模式的所有key,如>keys * 返回所有key
> type key //返回给定key的value类型不存在key时返回none
> dbsize //返回当前数据库的key数量
> del key //删除给定key,返回删除的数目
> randomkey //随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串
> rename oldkey newkey //重命名key,如果newkey存在将会被覆盖
> renamenx oldkey newkey //重命名key,newkey存在将返回失败
> expire key seconds //为key指定过期时间,单位是秒,如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。
> ttl key //返回设置过期时间的key的剩余过期秒数
> select db-index //通过索引选择数据库,默认连接的数据库所有是0,默认数据库有16个
> move key db-index //将key从当前数据库移动到指定数据库
> flushdb //删除当前数据库中所有key,慎用
> flushall //删除所有数据库中的所有key,更加慎用
4. 数据类型
(1)string
string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。下面是string类型的定义。
struct sdshdr {
long len;
long free;
char buf[];
};
buf是个char数组用于存贮实际的字符串内容。其实char和c#中的byte是等价的,都是一个字节,len是buf数组的长度,free是数组中剩余可用字节数。由此可以理解为什么string类型是二进制安全的了。因为它本质上就是个byte数组。当然可以包含任何数据了。另外string类型可以被部分命令按int处理,比如incr等命令。还有redis的其他类型像list,set,sorted set ,hash它们包含的元素与都只能是string类型。如果只用string类型,redis就可以被看作加上持久化特性的memcached,当然redis对string类型的操作比memcached多很多。如下:
> set key value //设置key对应的值为string类型的value,存在进覆盖
> setnx key value //同上,如果key已经存在,返回失败
> get key //获取key对应的string值,如果key不存在返回nil
> getset key value //原子的设置key的值,并返回key的旧值,如果key不存在返回nil
> mget key1 key2 ... keyN //一次获取多个key的值,如果对应key不存在,则对应返回nil
> mset key1 value1 ... keyN valueN //一次设置多个key的值,存在进覆盖
> msetnx key1 value1 ... keyN valueN //同上,但是不会覆盖已经存在的key
> incr key //对key的值做加加操作,并返回新值,incr一个不是int的value会返回错误,incr一个不存在的key设置key为1
> decr key //同上,减减操作,decr一个不存在key,则设置key为-1
> incrby key integer //同incr,加指定值 ,key不存在时候会设置key,并认为原来的value是 0
> decrby key integer //同decr,减指定值,也可以通过incrby一个负值来实现同样效果,反之一样
> append key value //给指定key的字符串值追加value,返回新字符串值的长度
> substr key start end //返回截取过的key的字符串值,注意并不修改key的值,下标是从0开始的。 下面给个例子
(2)list
redis的list类型其实就是一个每个子元素都是string类型的双向链表。所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1)。另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(2的32次方-1)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。有意思的是list的pop操作还有阻塞版本的。当我们[lr]pop一个 list对象是,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil。
为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。下面介绍list相关命令:
> lpush key string //在key对应list的头部添加字符串元素,不存在进添加key,返回list的长度
> rpush key string //同上,在尾部添加
> llen key //返回key对应list的长度,key不存在返回0
> lrange key start end //返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素
> ltrim key start end //截取list,保留指定区间内元素
> lset key index value //设置list中指定下标的元素值
> lrem key count value //从key对应list中删除count个和value相同的元素,count为0时候删除全部
> lpop key //从list的头部删除元素,并返回删除元素,如果key对应list不存在或者是空返回nil
> rpop key //同上,从尾部删除
> blpop key1...keyN timeout //从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在,list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1...keyN中的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil,有点像unix的select或者poll
> brpop //同blpop,一个是从头部删除一个是从尾部删除。
> rpoplpush srckey destkey //从srckey对应list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的
(3)set
redis 的set是string类型的无序集合。set元素最大可以包含(2的32次方-1)个元素。set是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash table大小时候需要同步(获取写锁)会阻塞其他读写操作。可能不久后就会改用跳表(skip list)来实现,跳表已经在sorted set中使用了。关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。下面详细介绍set相关命令:
> sadd key val //添加一个string元素到key对应的set集合中,如果元素已经在集合中返回0
> srem key val //从key对应set中移除给定元素
> spop key //删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返回nil
> srandmember key //同spop,随机取set中的一个元素,但是不删除元素
> smove srckey dstkey member //从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的
> scard key //返回set的元素个数,如果set是空或者key不存在返回0
> sismember key member //判断member是否在set中,存在返回1,0表示不存在或者key不存在
> sinter key1 key2...keyN //返回所有给定key的交集
> sinterstore dstkey key1...keyN //同sinter,但是会同时将交集存到dstkey下
> sunion key1 key2...keyN //返回所有给定key的并集
> sunionstore dstkey key1...keyN //同sunion,并同时保存并集到dstkey下
> sdiff key1 key2...keyN //返回所有给定key的差集
> sdiffstore dstkey key1...keyN //同sdiff,并保存差集到dstkey下
> smembers key //返回key对应set的所有元素,结果是无序的
(4)sorted set
和set一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score(根据score排序,相同的score按照字母顺序排放)。sorted set的实现是skip list和hash table的混合体。当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list并按照score排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))和skip list的开销一致,redis的skip list实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set最经常的使用方式应该是作为索引来使用,我们可以把要排序的字段作为score存储,对象的id当元素存储。下面是sorted set相关命令:
> zadd key score member //添加元素到集合,元素在集合中存在则更新对应score
> zrem key member //删除指定元素,1表示成功,如果元素不存在返回0
> zincrby key incr member //增加对应member的score值,然后移动元素并保持skip list保持有序。返回更新后的score值
> zrank key member //返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
> zrevrank key member //同上,但是集合中元素是按score从大到小排序
> zrange key start end //类似lrange操作从集合中去指定区间的元素。返回的是有序结果
> zrevrange key start end //同上,返回结果是按score逆序的
> zrangebyscore key min max //返回集合中score在给定区间的元素
> zcount key min max //返回集合中score在给定区间的数量
> zcard key //返回集合中元素个数
> zscore key element //返回给定元素对应的score
> zremrangebyrank key min max //删除集合中排名在给定区间的元素
> zremrangebyscore key min max //删除集合中score在给定区间的元素
(5)hash
redis hash是一个string类型的field和value的映射表。它的添加,删除操作都是O(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用 zipmap(又称为small hash)来存储的。这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。尽管zipmap的添加,删除,查找都是 O(n),但是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是说添加删除平均还是O(1)。如果field或者 value的大小超出一定限制后,redis会在内部自动将zipmap替换成正常的hash实现. 这个限制可以在配置文件中指定,如下:
hash-max-zipmap-entries 64 #配置字段最多64个
hash-max-zipmap-value 512 #配置value最大为512字节
下面介绍hash相关命令:
> hset key field value //设置hash field为指定值,如果key不存在,则先创建
> hget key field //获取指定的hash field
> hmget key filed1....fieldN //获取全部指定的hash filed
> hmset key filed1 value1 ... filedN valueN //同时设置hash的多个field
> hincrby key field integer //将指定的hash filed 加上给定值
> hexists key field //测试指定field是否存在
> hdel key field //删除指定的hash field
> hlen key //返回指定hash的field数量
> hkeys key //返回hash的所有field
> hvals key //返回hash的所有value
> hgetall key //返回hash的所有filed和value
5. redis事务
redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。
一般情况下redis在接受到一个client发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令后,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就结束事务上下文。如下:
> multi
OK
> incr a
QUEUED
> incr b
QUEUED
> exec
我们可以调用discard命令来取消一个事务,如下:
> multi
OK
> incr a
QUEUED
> incr b
QUEUED
> discard
OK
redis的事务实现是如此简单,当然会存在一些问题。 第一个问题是redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令。另一个十分罕见的问题是,当事务的执行过程中,如果redis意外的挂了。很遗憾只有部分命令执行了,后面的也就被丢弃了。当然如果我们使用append-only file方式持久化,redis会用单个write操作写入整个事务内容。即是是这种方式还是有可能只部分写入了事务到磁盘。发生部分写入事务的情况下,redis重启时会检测到这种情况,然后失败退出。可以使用redis-check-aof工具进行修复,修复会删除部分写入的事务内容。修复完后就能够重新启动了。
6. java客户端使用(jedis-2.1.0.jar)
redis是一个开源的key-value数据库。它又经常被认为是一个数据结构服务器。因为它的value不仅包括基本的string类型还有 list,set ,sorted set和hash类型。当然这些类型的元素也都是string类型。也就是说list,set这些集合类型也只能包含string 类型。你可以在这些类型上做很多原子性的操作。比如对一个字符value追加字符串(APPEND命令)。加加或者减减一个数字字符串(INCR命令,当然是按整数处理的).可以对list类型进行push,或者pop元素操作(可以模拟栈和队列)。对于set类型可以进行一些集合相关操作 (intersection union difference)。memcache也有类似与++,--的命令。不过memcache的 value只包括string类型。远没有redis的value类型丰富。和memcache一样为了性能,redis的数据通常都是放到内存中的。当然 redis可以每间隔一定时间将内存中数据写入到磁盘以防止数据丢失。
redis也支持主从复制机制(master-slave replication)。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数 据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。redis的其他特性包括简单的事务支持和发布订阅(pub/sub)通道功能,而且redis配置管理非常简单。还有各种语言版本的开源客户端类库。
官方的bench-mark(基准)数据如下:
测试完成了50个并发执行100000个请求,设置和获取的值是一个256字节字符串,Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz,文本执行使用loopback接口(127.0.0.1),结果:读的速度是110000次/s,写的速度是81000次/s 。
2. 安装
下载地址:http://www.redis.cn/download.html ,目前的最新稳定版是2.8.13。
可以在linux下运行如下命令进行安装:
$ tar xzf redis-2.8.13.tar.gz
$ cd redis-2.8.13
$ make
make完后 redis-2.8.13目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli等文件。下面启动redis服务:
$ ./redis-server // 注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动:
$ ./redis-server redis.conf // redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了,如下:
$ ./redis-cli
> set name jiang // name是key ,jiang是个string类型的value
OK
> get name // 得到name的value
"jiang"
3. keys
首先key也是字符串类型,但是key中不能包括边界字符。另外关于key的一个格式约定介绍下,object-type:id:field。比如user:1000:password,blog:xxidxx:title,还有key的长度最好不要太长。道理很明显占内存啊,而且查找时候相对短key也更慢。不过也不推荐过短的key,比如u:1000:pwd,这样的。显然没上面的user:1000:password可读性好。
下面介绍下key相关的公用命令:
> exists key //判断一个键是否存在
> keys pattern //返回指定模式的所有key,如>keys * 返回所有key
> type key //返回给定key的value类型不存在key时返回none
> dbsize //返回当前数据库的key数量
> del key //删除给定key,返回删除的数目
> randomkey //随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串
> rename oldkey newkey //重命名key,如果newkey存在将会被覆盖
> renamenx oldkey newkey //重命名key,newkey存在将返回失败
> expire key seconds //为key指定过期时间,单位是秒,如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。
> ttl key //返回设置过期时间的key的剩余过期秒数
> select db-index //通过索引选择数据库,默认连接的数据库所有是0,默认数据库有16个
> move key db-index //将key从当前数据库移动到指定数据库
> flushdb //删除当前数据库中所有key,慎用
> flushall //删除所有数据库中的所有key,更加慎用
4. 数据类型
(1)string
string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。下面是string类型的定义。
struct sdshdr {
long len;
long free;
char buf[];
};
buf是个char数组用于存贮实际的字符串内容。其实char和c#中的byte是等价的,都是一个字节,len是buf数组的长度,free是数组中剩余可用字节数。由此可以理解为什么string类型是二进制安全的了。因为它本质上就是个byte数组。当然可以包含任何数据了。另外string类型可以被部分命令按int处理,比如incr等命令。还有redis的其他类型像list,set,sorted set ,hash它们包含的元素与都只能是string类型。如果只用string类型,redis就可以被看作加上持久化特性的memcached,当然redis对string类型的操作比memcached多很多。如下:
> set key value //设置key对应的值为string类型的value,存在进覆盖
> setnx key value //同上,如果key已经存在,返回失败
> get key //获取key对应的string值,如果key不存在返回nil
> getset key value //原子的设置key的值,并返回key的旧值,如果key不存在返回nil
> mget key1 key2 ... keyN //一次获取多个key的值,如果对应key不存在,则对应返回nil
> mset key1 value1 ... keyN valueN //一次设置多个key的值,存在进覆盖
> msetnx key1 value1 ... keyN valueN //同上,但是不会覆盖已经存在的key
> incr key //对key的值做加加操作,并返回新值,incr一个不是int的value会返回错误,incr一个不存在的key设置key为1
> decr key //同上,减减操作,decr一个不存在key,则设置key为-1
> incrby key integer //同incr,加指定值 ,key不存在时候会设置key,并认为原来的value是 0
> decrby key integer //同decr,减指定值,也可以通过incrby一个负值来实现同样效果,反之一样
> append key value //给指定key的字符串值追加value,返回新字符串值的长度
> substr key start end //返回截取过的key的字符串值,注意并不修改key的值,下标是从0开始的。 下面给个例子
(2)list
redis的list类型其实就是一个每个子元素都是string类型的双向链表。所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1)。另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(2的32次方-1)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。有意思的是list的pop操作还有阻塞版本的。当我们[lr]pop一个 list对象是,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil。
为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。下面介绍list相关命令:
> lpush key string //在key对应list的头部添加字符串元素,不存在进添加key,返回list的长度
> rpush key string //同上,在尾部添加
> llen key //返回key对应list的长度,key不存在返回0
> lrange key start end //返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素
> ltrim key start end //截取list,保留指定区间内元素
> lset key index value //设置list中指定下标的元素值
> lrem key count value //从key对应list中删除count个和value相同的元素,count为0时候删除全部
> lpop key //从list的头部删除元素,并返回删除元素,如果key对应list不存在或者是空返回nil
> rpop key //同上,从尾部删除
> blpop key1...keyN timeout //从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在,list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1...keyN中的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil,有点像unix的select或者poll
> brpop //同blpop,一个是从头部删除一个是从尾部删除。
> rpoplpush srckey destkey //从srckey对应list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的
(3)set
redis 的set是string类型的无序集合。set元素最大可以包含(2的32次方-1)个元素。set是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash table大小时候需要同步(获取写锁)会阻塞其他读写操作。可能不久后就会改用跳表(skip list)来实现,跳表已经在sorted set中使用了。关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。下面详细介绍set相关命令:
> sadd key val //添加一个string元素到key对应的set集合中,如果元素已经在集合中返回0
> srem key val //从key对应set中移除给定元素
> spop key //删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返回nil
> srandmember key //同spop,随机取set中的一个元素,但是不删除元素
> smove srckey dstkey member //从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的
> scard key //返回set的元素个数,如果set是空或者key不存在返回0
> sismember key member //判断member是否在set中,存在返回1,0表示不存在或者key不存在
> sinter key1 key2...keyN //返回所有给定key的交集
> sinterstore dstkey key1...keyN //同sinter,但是会同时将交集存到dstkey下
> sunion key1 key2...keyN //返回所有给定key的并集
> sunionstore dstkey key1...keyN //同sunion,并同时保存并集到dstkey下
> sdiff key1 key2...keyN //返回所有给定key的差集
> sdiffstore dstkey key1...keyN //同sdiff,并保存差集到dstkey下
> smembers key //返回key对应set的所有元素,结果是无序的
(4)sorted set
和set一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score(根据score排序,相同的score按照字母顺序排放)。sorted set的实现是skip list和hash table的混合体。当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list并按照score排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))和skip list的开销一致,redis的skip list实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set最经常的使用方式应该是作为索引来使用,我们可以把要排序的字段作为score存储,对象的id当元素存储。下面是sorted set相关命令:
> zadd key score member //添加元素到集合,元素在集合中存在则更新对应score
> zrem key member //删除指定元素,1表示成功,如果元素不存在返回0
> zincrby key incr member //增加对应member的score值,然后移动元素并保持skip list保持有序。返回更新后的score值
> zrank key member //返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
> zrevrank key member //同上,但是集合中元素是按score从大到小排序
> zrange key start end //类似lrange操作从集合中去指定区间的元素。返回的是有序结果
> zrevrange key start end //同上,返回结果是按score逆序的
> zrangebyscore key min max //返回集合中score在给定区间的元素
> zcount key min max //返回集合中score在给定区间的数量
> zcard key //返回集合中元素个数
> zscore key element //返回给定元素对应的score
> zremrangebyrank key min max //删除集合中排名在给定区间的元素
> zremrangebyscore key min max //删除集合中score在给定区间的元素
(5)hash
redis hash是一个string类型的field和value的映射表。它的添加,删除操作都是O(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用 zipmap(又称为small hash)来存储的。这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。尽管zipmap的添加,删除,查找都是 O(n),但是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是说添加删除平均还是O(1)。如果field或者 value的大小超出一定限制后,redis会在内部自动将zipmap替换成正常的hash实现. 这个限制可以在配置文件中指定,如下:
hash-max-zipmap-entries 64 #配置字段最多64个
hash-max-zipmap-value 512 #配置value最大为512字节
下面介绍hash相关命令:
> hset key field value //设置hash field为指定值,如果key不存在,则先创建
> hget key field //获取指定的hash field
> hmget key filed1....fieldN //获取全部指定的hash filed
> hmset key filed1 value1 ... filedN valueN //同时设置hash的多个field
> hincrby key field integer //将指定的hash filed 加上给定值
> hexists key field //测试指定field是否存在
> hdel key field //删除指定的hash field
> hlen key //返回指定hash的field数量
> hkeys key //返回hash的所有field
> hvals key //返回hash的所有value
> hgetall key //返回hash的所有filed和value
5. redis事务
redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。
一般情况下redis在接受到一个client发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令后,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就结束事务上下文。如下:
> multi
OK
> incr a
QUEUED
> incr b
QUEUED
> exec
我们可以调用discard命令来取消一个事务,如下:
> multi
OK
> incr a
QUEUED
> incr b
QUEUED
> discard
OK
redis的事务实现是如此简单,当然会存在一些问题。 第一个问题是redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令。另一个十分罕见的问题是,当事务的执行过程中,如果redis意外的挂了。很遗憾只有部分命令执行了,后面的也就被丢弃了。当然如果我们使用append-only file方式持久化,redis会用单个write操作写入整个事务内容。即是是这种方式还是有可能只部分写入了事务到磁盘。发生部分写入事务的情况下,redis重启时会检测到这种情况,然后失败退出。可以使用redis-check-aof工具进行修复,修复会删除部分写入的事务内容。修复完后就能够重新启动了。
6. java客户端使用(jedis-2.1.0.jar)
package test; import java.util.HashMap; import java.util.List; import java.util.Map; import redis.clients.jedis.Jedis; public class TestRedis { public static void main(String[] args) { Jedis jedis = new Jedis("192.168.214.184",6379); //连接redis服务 //jedis.auth("password"); //密码验证-如果你没有设置redis密码可不验证即可使用相关命令 // String类型 jedis.set("name_jiang", "111"); //设置 System.out.println(jedis.get("name_jiang")); jedis.append("name_jiang", "222"); //追加 System.out.println(jedis.get("name_jiang")); jedis.del("name_jiang"); //删除 System.out.println(jedis.get("name_jiang")); jedis.mset("name_jiang1", "1","name_jiang2", "2","name_jiang3", "3"); //同时设置多个 System.out.println(jedis.mget("name_jiang1","name_jiang2","name_jiang3")); //同时获取多个,返回List jedis.del("name_jiang1"); jedis.del("name_jiang2"); jedis.del("name_jiang3"); // list类型 jedis.del("list_jiang"); System.out.println(jedis.lrange("list_jiang", 0, -1)); jedis.lpush("list_jiang", "A"); jedis.lpush("list_jiang", "B"); jedis.lpush("list_jiang", "C"); System.out.println(jedis.lrange("list_jiang", 0, -1)); System.out.println(jedis.lrange("list_jiang", 0, 1)); jedis.del("list_jiang"); //set类型 jedis.sadd("set_jiang", "wobby"); jedis.sadd("set_jiang", "kings"); jedis.sadd("set_jiang", "demon"); System.out.println(jedis.scard("set_jiang")); //返回元素个数 System.out.println(jedis.smembers("set_jiang")); System.out.println(jedis.sismember("set_jiang", "wobby")); System.out.println(jedis.srandmember("set_jiang")); jedis.srem("set_jiang", "demon"); System.out.println(jedis.smembers("set_jiang")); jedis.del("set_jiang"); // sorted set类型 Map<Double,String> m = new HashMap<Double,String>(); m.put((double) 1, "111"); m.put((double) 2, "222"); jedis.zadd("ss_jiang", m); System.out.println(jedis.zrange("ss_jiang", 0, 9)); jedis.del("ss_jiang"); // map类型 Map<String,String> user = new HashMap<String,String>(); user.put("name", "111"); user.put("password", "222"); jedis.hmset("user", user); //设置map System.out.println(jedis.hlen("user")); //长度 System.out.println(jedis.hkeys("user")); //map中的所有键值 System.out.println(jedis.hvals("user")); //map中的所有value List<String> rsmap = jedis.hmget("user", "name","password"); //取出map中的name字段值 System.out.println(rsmap); jedis.hdel("user", "password"); //删除map中的某一个键值 password System.out.println(jedis.hmget("user", "name", "password")); jedis.del("user"); } }
发表评论
-
Oracle存储过程
2014-09-16 11:58 14261. 简介 存储过程是SQL 语句和可选控制流语句的预 ... -
Oracle语句优化
2014-09-11 12:43 6011. 避免使用“*”替代所 ... -
Oracle序列
2014-09-10 10:26 7381. 序列简介 序列是Ora ... -
Oracle分区表
2014-09-02 16:56 13771. 分区表简介 当 ... -
Oracle索引
2014-09-01 18:06 15351. 索引简介 索引特点 ... -
Oracle基本函数
2014-07-28 16:40 832一、字符函数 1. ASCII(x) 功能:该函数用于返回字符 ... -
Oracle基本操作
2014-07-25 16:10 1323一、表操作 1. 常用数据类型 NUMBER(p,s):可变长 ... -
MySQL解压版安装与配置 (Windows)
2014-03-08 11:02 12231. 到官网下载MySQL解压版,然后将mysql解压到任意路 ...
相关推荐
**Redis与LabVIEW的整合:RedisinLabVIEW和LabVIEWRedis工具包** Redis是一个高性能的键值数据库,常用于数据缓存和消息队列。它支持丰富的数据类型,包括字符串、哈希表、列表、集合和有序集合。在LabVIEW...
Redis 是一个开源的内存数据结构存储系统,常被用作数据库、缓存和消息代理。在Windows环境下,Redis 的安装和使用与在Linux系统中有所不同。这里我们将详细讨论Windows版Redis 5.0.14的相关知识点。 1. **Redis ...
最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或者是我不会用。没有办法,最好找到了...
在Linux系统中安装Redis是一个常见的任务,特别是在搭建服务器或开发基于Redis的数据缓存应用时。Redis是一个开源的、高性能的键值对存储系统,适用于数据缓存、消息队列等多种场景。本文将详细介绍如何在Linux上...
Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值存储系统,广泛应用于缓存、消息队列、数据持久化等多种场景。它以其高效、轻量级的特性,在IT行业中备受青睐,尤其是在互联网领域。在Windows环境...
Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值对存储系统,常被用作数据缓存、消息队列以及数据库等角色。它的设计目标是速度和数据持久化,支持多种数据结构,如字符串、哈希表、列表、集合、...
redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和...
Redis是一款高性能的键值对数据库,常用于缓存、消息队列等场景。在Windows操作系统上运行Redis,通常需要借助一些额外的工具。标题提到的"redis在win上的运行脚本redis.bat"就是一个帮助用户在Windows环境下启动...
Redis是世界上最受欢迎的开源内存数据结构存储系统,它可以用作数据库、缓存和消息代理。在Windows 64位环境下,Redis的安装和卸载过程是很多开发者和系统管理员需要了解的重要技能。以下是对这些知识点的详细说明:...
Redis Desktop Manager是一款强大的开源图形化界面工具,专为管理和操作Redis键值存储系统而设计。它为用户提供了直观且高效的界面,使得在处理Redis数据库时能够更加便捷。这个压缩包包含的就是这款工具的安装文件...
Redis是一款高性能的键值对内存数据库,被广泛应用于缓存、数据存储等领域。在这个Windows 64位版本的Redis 7.0.5中,我们能够看到一系列关键组件和配置文件,这使得它能够在Windows环境下运行。以下是关于Redis ...
Redis7.0.4.zip,解压缩到D盘根目录后,安装后启动为Windows服务 注意是windows 64位系统才可使用,不支持windows 32位系统使用 已经在Win10,Win11,Windows server 2012系统测试运行可用 使用步骤注意事项: ...
基于前后端分离的应用,无论是否使用Redis,都需要考虑如何进行数据的存储和缓存。下面我将分别介绍基于Redis和无Redis的两种版本的特点。 基于Redis的版本 特点 缓存处理:Redis作为内存数据库可以用来缓存频繁访问...
在Windows上安装Redis的过程涉及到多个步骤,包括启用必要的Windows功能、安装WSL2(Windows Subsystem for Linux 2)、设置默认WSL版本以及在Linux环境中安装Redis。以下是对这些步骤的详细说明: 1. **启用...
Redis 是一个高性能的键值数据库,它以键值对的形式存储数据,广泛应用于缓存、消息中间件、实时分析等领域。在 Windows 环境下,通常需要通过安装过程来设置 Redis 服务,但这里提供的资源是“redis 免安装”,意味...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储数据库,常用于缓存、消息队列等场景。本文将深入探讨Redis的可视化工具及其免安装绿色版的使用,帮助你更好地管理和操作Redis服务器。 首先,了解...
Redis 使用教程详解 Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的 session 分离等领域。下面是 Redis 的详细使用教程。 ...
(1)支持Lua脚本:Redis 3.0支持Lua脚本,可以在Redis中执行脚本,大大提高了Redis的灵活性和可扩展性; (2)可插拔模块化:Redis 3.0提供了可插拔的模块化功能,可以根据用户的需求,自定义模块,实现不同的功能...
"Redis++使用说明,windows下编译Redis-Plus-Plus" 在这篇文章中,我们将详细介绍如何在Windows平台下编译Redis++,包括编译hiredis.lib和Win32_Interop.lib静态库文件的过程,然后安装Cmake并编译Redis++,最后...
Redis是一款高性能的键值存储系统,常用于数据库、缓存和消息代理等场景。它支持丰富的数据类型,如字符串、哈希、列表、集合和有序集合。在Windows平台上使用Redis,通常需要通过编译源码或者寻找预编译的二进制...