Redis:REmote DIctionary Server远程字典服务器
- 初学Redis
- Redis由来
- Redis安装
- Windows下安装
- 常用命令:
- Redis键(key)
- Redis数据类型
- Redis字符串(String)
- Redis列表(List)
- Redis集合(Set)
- Redis哈希(Hash)
- Redis有序集合Zset(sorted set)
初学Redis
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的、使用C语言编写、支持网络、可基于内存亦可持久化的Key-Value数据库,并提供多种语言的API。
redis索引从0开始,默认端口号:6379,默认16个数据库
Redis由来
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,没多久该公司的创始人Sanfilippo对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。
Redis安装
Windows下安装
参考:Redis安装|菜鸟教程 RUNOOB.com 入门学习安装windows版redis即可。(虽然不是官方的,但基于学习使用还是很方便的)Redis Window版下载地址
下载以后可以把安装目录配置到环境变量path下,用起来方便一些。
常用命令:
服务端启动:redis-server.exe redis.windows.conf
windows系统下,如果为redis配置了系统环境变量,直接在任意路径下访问redis-server.exe即可启动redis服务端,后面的redis.windows.conf可以省略,使用默认的。
客户端启动:redis-cli -h 127.0.0.1 -p 6379
查看是否连通:ping
set值:(如果key已存在,默认覆盖原来的)set key1 hello
get值:get key1
删除keydel key1
查询:keys (pattern)
切换数据库:select (number)
查看当前库中的数据条数:dbsize
清空当前库:flushdb
清空所有库中数据:flushall
Redis键(key)
关于redis键的一些常用操作命令:
判断key是否存在:exists key1
移动key到另一个库中:move k3 2 (把k3移动到2号库中,相当于剪切)
为给定的key设置过期时间(过期了以后自动从内存移除):expire k1 秒钟
查看给定的key还有多少秒过期,-1表示永不过期,-2表示已过期:ttl k1
查看给定的key是什么数据类型:type key1
序列化给定key,并返回被序列化的值:dump key1
Redis数据类型
redis有5大常用数据类型:
- 字符串
- 列表
- 集合
- 哈希
- 有序集合
【获得redis常见数据类型操作命令】:http://redisdoc.com/
Redis字符串(String)
string是redis中最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。【一个redis中字符串value最多可以是512M。】
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
总结:单值单value
案例:
- set/get/del/append(字符串后追加)/strlen
- incr(自增1)/decr(自减1)/incrby/decrby,一定要是数字才能进行加减
- getrange(类似Java中subString,但包含最后那个下标的值)/setrange(将key的值从某一下标处以指定值进行覆盖)
- setex(set with expire)定义键和值的同时设置过期时间秒数
- setnx(set if not exist,如果键不存在,则给该键设置值,否则不给它赋值,避免后值覆盖前值)
- mset/mget/msetnx(m代表more多个,表示同时操作多个键值对)
注意:msetnx k1 v1 k2 v2 k8 v8 中,如果k1和k2已经存在,而k8不存在,则k8也插入不进去。它们是一个原子操作,要么都成功,要么都失败。
- getset(先get再set)
Redis列表(List)
redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际上是一个链表。
总结:单值多value
案例:
- lpush/rpush/lrange(l表示从左边插入,r代表从右边插入,lrange表示从左往右取range范围)
- lpop(删除最左边元素并返回)/rpop(删除最右边元素并返回)
- lindex(按照索引下标获取元素(从左往右))
- llen (获取列表长度)
- lrem list03 n m (表示删除list03中n个m元素)
- ltrim list04 开始索引 结束索引 ,截取list04中指定范围的值,再把结果赋值给list04
- rpoplpush 源列表 目的列表 (从源列表的右边出栈,压栈入目的列表中)
- lset list index value (将list指定索引的值设置为value)
- linsert list before/after v1 v2 (再list中v1的 前面/后面 插入v2)
性能总结:
它是一个字符串链表,left、right都可以插入删除。
如果键不存在,创建新的链表。
如果键已经存在,追加内容。
如果值全部移除,对应的键会自然消失。(redis认为空list无意义)
链表的操作无论是头和尾都效率极高,如果是对中间某元素进行操作,效率就会很低。
Redis集合(Set)
redis的set是string类型的无序集合,它是通过类似于HashTable的结构实现的。
总结:单值多value(且不可重复)
案例:
- sadd set01 a b c a b c(往set集合中存储元素)
注意:如果元素重复,会自动去除重复元素
- smembers (遍历set集合)
- sismember set01 hello (查看set01中有没有值为hello元素,如果有返回1,如果没有返回0)
- scard set01 (获取set01集合中元素的个数)
- srem set01 vaue (删除set01集合中值为value的元素)
- srandmember set01 整数n (从set01集合中随机返回n个元素)
- spop set01 (可以理解为随机出栈)
- smove set1 set2 set1中某一值 (把set1的已经存在的指定值存放到set2中)
数学集合类:
- 差集:sdlff
- 交集:sinter
- 并集:sunion
Redis哈希(Hash)
Redis Hash是一个键值对集合。是string类型的field和value的映射表,hash特别适合用于存储对象。类似Java中的Map<String,Object>
总结:K-V模式不变,但V是一个键值对。
例如把一个对象(User[id:1,name:tom,age:18])存入redis:
案例:
- hset/hget/hmset/hmget/hgetall/hdel (见名知义)
例如:存入一个student对象:
可以看到,它把一个对象也映射为一个一个的key,value。
hdel key field [field…] (删除对象中某些属性)
- hlen
- hexists key field (判断指定属性在对象中存不存在,如果存在返回1,否则返回0)
- hkeys/hvals (获取对象中所有key/value)
- hincrby/hincrbyfloat
基本用法:
hincrby key field increment
hincrbyfloat key field increment
例如,让student对象年龄增加1,再加10:
- hsetnx key field value (如果field已经存在,就不赋值,如果field不存在,添加field和value到key中)
Redis有序集合Zset(sorted set)
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
例如:之前set是 k1 [v1 , v2 , v3]
现在zset是 k1 [score1 v1 , score2 v2 , score3 v3]
后面的score1,v1可以看作是一个键值对,score1代表值,而v1代表键,v1不可以重复,而score1可以重复。
redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但分数(score)可以重复。
说白了就是存入元素时给每个元素加一个权重,将来取出来的元素会自动按照权重排序:
zrange后面还有一个可选参数(withscores),如果想看score也可以:
案例:
- zadd/zrange
- zrangebyscore key 开始score 结束score (根据分数的区间来取得符合要求的元素)
例如取得班级表中80分-90分的同学:
zrangebyscore class_scores 80 90 [withscores] [limit offset count]
如果90前面加一个左括号,就表示不包含的意思:
如果使用limit,格式为:zrangebyscore class_scores 80 90 limit start end
它就类似一个分页,首先筛选80分到90分的同学,假如筛选出10个同学,那么使用start和end对结果集的下标进行截取,只取其中某一部分数据。
- zrem key member 删除集合中指定元素
- zcard/zcount/zrank/zscore
zcard key 统计zset集合中元素的个数
zcount key min max 根据限定score的范围得出符合条件的元素个数
zrank key member 获取指定元素在zset集合中存放的下标索引值
zscore key member 获取指定元素在zset集合中对应的score值
- zrevrank key member值 ,与zrank key member 类似,这个是刚好相反,逆序获得下标值
- zrevrange key start stop
- zrevrangebyscore key max min