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的值从某一下标处以指定值进行覆盖)
  • redis的索引库有几个 redis有索引吗_redis的索引库有几个

  • setex(set with expire)定义键和值的同时设置过期时间秒数
  • redis的索引库有几个 redis有索引吗_redis_02

  • setnx(set if not exist,如果键不存在,则给该键设置值,否则不给它赋值,避免后值覆盖前值)
  • mset/mget/msetnx(m代表more多个,表示同时操作多个键值对)
  • redis的索引库有几个 redis有索引吗_Redis_03

注意: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范围)
  • redis的索引库有几个 redis有索引吗_字符串_04

  • redis的索引库有几个 redis有索引吗_redis_05

  • lpop(删除最左边元素并返回)/rpop(删除最右边元素并返回)
  • lindex(按照索引下标获取元素(从左往右))
  • llen (获取列表长度)
  • lrem list03 n m (表示删除list03中n个m元素)
  • redis的索引库有几个 redis有索引吗_redis的索引库有几个_06

  • ltrim list04 开始索引 结束索引 ,截取list04中指定范围的值,再把结果赋值给list04
  • redis的索引库有几个 redis有索引吗_字符串_07

  • rpoplpush 源列表 目的列表 (从源列表的右边出栈,压栈入目的列表中)
  • redis的索引库有几个 redis有索引吗_字符串_08

  • lset list index value (将list指定索引的值设置为value)
  • linsert list before/after v1 v2 (再list中v1的 前面/后面 插入v2)
  • redis的索引库有几个 redis有索引吗_字符串_09

性能总结:

它是一个字符串链表,left、right都可以插入删除。

如果键不存在,创建新的链表。

如果键已经存在,追加内容。

如果值全部移除,对应的键会自然消失。(redis认为空list无意义)

redis的索引库有几个 redis有索引吗_redis_10

链表的操作无论是头和尾都效率极高,如果是对中间某元素进行操作,效率就会很低。

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个元素)
  • redis的索引库有几个 redis有索引吗_Redis_11

  • spop set01 (可以理解为随机出栈)
  • smove set1 set2 set1中某一值 (把set1的已经存在的指定值存放到set2中)

数学集合类:

  • 差集:sdlff
  • 交集:sinter
  • 并集:sunion

redis的索引库有几个 redis有索引吗_redis_12

Redis哈希(Hash)

Redis Hash是一个键值对集合。是string类型的field和value的映射表,hash特别适合用于存储对象。类似Java中的Map<String,Object>

总结:K-V模式不变,但V是一个键值对。

例如把一个对象(User[id:1,name:tom,age:18])存入redis:

redis的索引库有几个 redis有索引吗_redis_13

案例:

  • hset/hget/hmset/hmget/hgetall/hdel (见名知义)

例如:存入一个student对象:

redis的索引库有几个 redis有索引吗_Redis_14

可以看到,它把一个对象也映射为一个一个的key,value。

hdel key field [field…] (删除对象中某些属性)

  • hlen
  • hexists key field (判断指定属性在对象中存不存在,如果存在返回1,否则返回0)
  • hkeys/hvals (获取对象中所有key/value)
  • redis的索引库有几个 redis有索引吗_redis_15

  • hincrby/hincrbyfloat

基本用法:

hincrby key field increment

hincrbyfloat key field increment

例如,让student对象年龄增加1,再加10:

redis的索引库有几个 redis有索引吗_Redis_16

  • 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)可以重复。

说白了就是存入元素时给每个元素加一个权重,将来取出来的元素会自动按照权重排序:

redis的索引库有几个 redis有索引吗_Redis_17

zrange后面还有一个可选参数(withscores),如果想看score也可以:

redis的索引库有几个 redis有索引吗_redis的索引库有几个_18

案例:

  • zadd/zrange
  • zrangebyscore key 开始score 结束score (根据分数的区间来取得符合要求的元素)

例如取得班级表中80分-90分的同学:

zrangebyscore class_scores 80 90 [withscores] [limit offset count]

redis的索引库有几个 redis有索引吗_redis_19

如果90前面加一个左括号,就表示不包含的意思:

redis的索引库有几个 redis有索引吗_redis的索引库有几个_20

如果使用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