Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Window 下安装
下载地址:https://github.com/dmajkic/redis/downloads
下载到的Redis支持32bit和64bit。根据自己实际情况选择,将64bit的内容cp到自定义盘符安装目录取名redis。 如 C:\reids
打开一个cmd窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.conf 。
如果想方便的话,可以把redis的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个redis.conf可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:
redis安装
这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。
切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 。
设置键值对 set myKey abc
取出键值对 get myKey
Linux安装
1.下载并安装:
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
2.编译并安装
$ cd redis-2.8.17/src
$ make PREFIX=~/redis/redis install
3.在解压后的目录拷贝redis.conf文件到安装目录下
$ cd redis-2.8.17
$ cp redis.conf ~/redis/redis6379
3-1.redis前端程序启动
$ cd ~/redis/redis6379/bin
$ ./redis-server
3-2.修改redis.conf文件中 ’daemonize no‘ 修改为 'daemonize yes'
3-3.redis后端程序启动
./redis-server ./redis.conf
4.查看redis启动状态
$ ps aux|grep redis
5.查看 redis 是否启动?
$ ./redis-cli
redis 127.0.0.1:6379> ping
PONG
./redis-cli -p 6379 //指点链接redis
./redis-cli -h 192.168.1.107 -p 7111 //链接指定的redis
Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
key定义的注意:1.不要超过1024个字节
String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
#相关命令
set name imooc //设值
get name //取值
incr num(key) //递增
incrby num 5 //递增 5
decr num(key) //递减
decrby num 4 //递减4
append num 7 //在后面追加7
List(字符串列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
ArrayList使用数组方式
LinkedList使用双向链表方式
“redis.net.cn”是List列表名称,列表最多可存储 23^2 - 1 元素 (4294967295, 每个列表可存储40多亿)
#相关命令
//两端添加
lpush mylist(key) a b c //添加左侧元素
rpush mylist 1 2 3 //添加右侧元素
//查看列表
lrange mylist 0(开始位置) 5(结束位置)
lrange mylist 0 -2(倒数第二个)
//两端弹出
lpop mylist //弹出后list中没有该元素(左侧)
rpop mylist //右侧弹出
//获取元素个数
llen mylist
//把‘x’插入到mylist前面,有则插入
lpushx mylist x //左侧
rpushx mylist2 y //右侧
//lrem mylist 2 3 //从头到
zset(sorted set : 有序字符串集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
#相关命令
#添加元素
zadd mysort 70(分数) zs 80 ls 90 ww
zadd mysort 100 zs //会把‘zs’中的分数给替换为‘100’
#获得元素
zcard mysort //获取集合中成员数量
(注意:相同元素的不能添加)
zscore mysort zs //获取元素分数
(注意:添加相同元素时,元素不能添加,分数会覆盖)
#删除元素
zrem mysort ls ww //删除‘ls’和‘ww’
zremrangebyrank mysort 0 4 //根据范围(排序)删除元素
zremrangebyscore mysort 80 100 //根据范围(分数)删除元素
#范围查询
zrange mysort 0 -1 //从第一个元素到最后一个元素查询(正序)
zrange mysort 0 -1 withscores //元素查询时,可以获取它的分数
zrangebyscore mysort 0 100 withscores //根据分数范围查询
zrevrange mysort 0 -1 withscores //元素查询(反序)
#扩展命令
zrangebyscore mysort 0 100 withscores limit 0 2 //根据分数范围查询,分页查询 页大小为2,页码是1
zincrby mysort 3 ls //给指定的元素分数添加‘3’
zcount mysort 80 90 //查看80-90分的元素的个数
Hash(哈希)
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
使用了 Redis HMSET, HEGTALL 命令,user:1 为键值。每个 hash 可以存储 23^2 - 1 键值对(40多亿)
#相关命令
hset myhash(key) username(属性) jack(字段名) //设单个属性值
hset myhash age 18
hget myhash username //获取单个属性值
hmset myhash2 username rose age 21 //设值多个属性值
hmget myhash username age //获取多个属性值
hgetall myhash //获取key中所有属性值
hdel myhash2 username age //删除多个字段
del myhash2 //删除整个hash
hincrby myhash age 5 //hash中增加数字
hexists myhash username //判断myhash中的username是否存在
hlen myhash //获取属性数量
hkeys myhash //获取属性中所有的名称
hvals myhash //获取属性中的值
Set(字符串集合)
Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
Set集合中不允许出现重复元素
sadd 命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误。
sadd key member
注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
#相关命令
#添加/删除元素
sadd myset a b c //添加元素(添加过后不能再添加相同的值)
srem myset a b //删除元素
#获取集合中的元素
smembers myset //查看set集合中的元素
sismember myset a //判断集合中是否存在'a'
#集合中的差集运算
sadd mya1 a b c
sadd myb1 a c 1 2
sdiff mya1 myb1
#集合中的交集运算
sadd mya2 a b c
sadd myb2 a c 1 2
sinter mya2 myb2
#集合中的并集运算
sadd mya3 a b c
sadd myb3 a c 1 2
sunion mya3 myb3
#扩展命令
scard myset //得到集合中的元素数量
srandmember myset //随机获取集合中的元素
sdiffstore my1 mya1 myb1 //把mya1与myb1相差的值放到my1中
sinterstore my2 mya2 myb2 //把mya2与myb2的交集放到my2
sunionstore my3 mya3 myb3 //把mya3yumyb3的并集放到my3
smembers my1
./redis-cli -h 192.168.0.66 -p 6379 //连接redis服务器
clear //清楚控制台
#通用命令
keys * //查询所有的key
keys my? //查询以‘my’开头的key
del my1 my2 my3 //删除指定的key
exists my1 //检验key是否存在
rename my1(旧的名称) newmy1(新的名称) //重命名
expire newmy1 1000 //设置过期时间为1000秒
ttl newmy1 //查看key所剩的时间
type newmy1 //获取指定key的类型
redis特性
#多数据库
select 1 //选择数据库
最多连接16台数据库
flushall //清除数据库
清除数据库1时,会把数据库0给清除掉
move myset(key) 1(一号数据库) //移动key到其他数据库
#事务
在事务中所有命令都会串行化执行,不会给其他数据库有任何命令,事务中的命令都会原子化执行,当出现异常时,后面的命令都会被执行,在运行时,当出现硬件问题、网络中断等等,事务中的命令将不会被执行,事务外的才会执行
multi //事务开启,在‘multi’里的命令都被视为事务中的命令,存储在命令的队列当中
exec //相当于提交 当执行这个命令,事务里面的命令都会被原子化执行
discard //相当于回滚
#事务的提交
窗口1
窗口2:窗口1累加两次后,窗口2获取值时还是2
窗口1:提交事务
窗口2:这时窗口2才能看到累加的结果
#事务的回滚
感兴趣的朋友可以关注微信公众号(会定时推送新的知识):