新人入坑Redis必会的吐血总结
一、什么是Redis
Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map。简单来讲,Redis是一种NOSQL内存数据库,小伙伴们可不要把它理解为NO SQL(不是SQL),它的全称是Not Only SQL(不仅仅是SQL),换个层面来讲,它是一种非关系型的数据库,它是作为关系型数据库的良好补充,它与传统的MySQL,Oracle不同之处在于,它是通过在内存中读写数据,大大提高了读写速度。可以说,Redis是为了解决网站高并发、高可用、高可扩展、大数据存储等一系列问题而产生的数据库解决方案,不可或缺的一部分。
它具有以下特点:
1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2、Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list、set、sortedset、hash等数据结构的存储。
3、Redis支持数据的备份,即master-slave模式的数据备份。
Redis有五种键值类型:
- String字符类型
- hash散列类型
- list列表类型
- set集合类型
- sortedset有序集合类型
而本文将基于Redis5.0为例来介绍Redis一些相关命令的使用和踩过的坑
二、关于Redis的安装与启动
环境准备
- CentOS7 (未安装Development Tools)
- Redis5.0-rc3.tar.gz
安装教程请参看这里:https://www.cnblogs.com/ECJTUACM-873284962/p/9532043.html
在线环境
官网似乎提供了一个在线的Redis平台,链接在这里:http://try.redis.io/
Redis启动
前端启动
按照我所提供的教程安装以后,我们只需要输入命令redis-server即可,界面如下:
前端停止启动
- 强制关闭:Ctrl+c
- 正常关闭[root@sakura]# redis-cli shutdown
后端启动
因为Redis在实际使用中不会只是一个Redis单独工作,启动和关闭方式中的ip地址和端口号可以在配置文件中自行修改,下面会有修改方式.
启动方式
- 需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下.直接复制粘贴即可
- 修改redis.conf文件,将daemonize改为yes(vi redis.conf进去,:/daemonize搜索).
- 使用命令后端启动redis.命令行redis-server redis.conf(以配置文件启动)
- 查看是否启动成功.命令行 ps -aux | grep redis (直接查看redis的进程)
如果你之前按照我所提供的教程修改过,这一过程可以直接忽略就好
关闭方式
- 强制关闭:kill -9 PID
- 正常关闭:redis-cli -h ip地址 -p 端口号(默认端口号是6379) shutdown
在项目中,建议使用正常关闭。 因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。
Redis客户端启动
启动客户端命令:[root@sakura]# redis-cli -h ip地址 -p 端口号
由于默认IP是127.0.0.1,端口是6379,我们只需要输入命令redis-cli即可
退出:127.0.0.1:6379> quit即可
三、Redis数据类型及常用命令讲解
1、Redis-String
string使用环境:主要用于保存json格式的字符串
赋值
set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回"OK",如果赋予相同的key,新的value会覆盖老的value
example:
127.0.0.1:6379> set username zhangsan OK
取值
get key:获取key的value。如果与该key关联的value不是string类型,redis将返回错误信息,因为get命令只能用于获取string value;如果该key不存在,返回nil
example:
127.0.0.1:6379> get username "zhangsan"
删除
del key:删除指定key,返回值是数字类型,表示删了几条数据
example:
127.0.0.1:6379> del username (integer) 1
扩展
getset key value:先获取该key的值,然后再设置该key的值
example:
127.0.0.1:6379> getset username zhangsan (nil) 127.0.0.1:6379> keys * 1) "username" 127.0.0.1:6379> get username "zhangsan"
incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后的值为1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于++(作用:统计网站访客人数,当计数器)
example:
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> incr age (integer) 19
decr key:将指定的key的value原子性的递减1,如果该key不存在,其初始值为0,在incr之后的值为-1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于--i
example:
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> decr age (integer) 17
append key value:拼接字符串,如果该key存在,则在原有的value后追加该值,如果该key不存在,则重新创建一个key/value
example:
127.0.0.1:6379> set information hel OK 127.0.0.1:6379> append information lo (integer) 5 127.0.0.1:6379> get information "hello"
incrby和decrby:只能对字符串是数字的进行操作,incrby key value是对原有的key的值增加value,而decrby key value是对原有的key的值减少value
example:
127.0.0.1:6379> get age "17" 127.0.0.1:6379> incrby age 10 (integer) 27 127.0.0.1:6379> decrby age 10 (integer) 17 127.0.0.1:6379> get information "hello" 127.0.0.1:6379> incrby information 10 (error) ERR value is not an integer or out of range 127.0.0.1:6379> decrby information 10 (error) ERR value is not an integer or out of range
2、Redis-hash
Redis中的hash类型可以看成具有string key和string value的map容器,所以该类型非常适合于存储值对象的信息。如username,password和age等。如果hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个hash可以存储4294967295个键值对。
hash特点:占用的磁盘空间极少
赋值:
hset key field value:为指定的key设定field/value对(键值对)
example:
127.0.0.1:6379> hset key1 field1 123 (integer) 1
hmset key field value[field2 value2...]:设置key中的多个field/value
example:
127.0.0.1:6379> hmset aaa name kitty age 20 OK
取值:
hget key filed:获取指定的key的field的值
example:
127.0.0.1:6379> hget key1 field1 "123"
hmget key filed1 field2...:获取key中的多个field的值
example:
127.0.0.1:6379> hmget aaa name age 1) "kitty" 2) "20"
hgetall key:获取key中的所有field-value2
example:
127.0.0.1:6379> hgetall aaa 1) "name" 2) "kitty" 3) "age" 4) "20"
删除
hdel key field[field...]:可以删除一个或多个字段,返回值是被删除的字段个数
example:
127.0.0.1:6379> hdel key1 field1 (integer) 1
del key:删除整个list
example:
127.0.0.1:6379> del aaa (integer) 1
增加数字
hincrby key field increment:设置key中的field增加increment,如age增加20
example:
127.0.0.1:6379> hmset aaa name kitty age 20 OK 127.0.0.1:6379> hincrby aaa age 20 (integer) 40
扩展命令
hexists key field:判断指定的key中的field是否存在
example:
127.0.0.1:6379> hexists aaa name (integer) 1 127.0.0.1:6379> hexists aaa aaaa (integer) 0
hlen key:获取key所包含的field的数量
example:
127.0.0.1:6379> hlen aaa (integer) 2
hkeys key:获得所有的字段
example:
127.0.0.1:6379> hkeys aaa 1) "name" 2) "age"
3、Redis-list
Redis中list选取的是链表,因为在Redis操作中,最多的操作是进行元素的增删
赋值
lpush key value [value1 value2 ...] 在指定的key所关联的list头部插入所有的value,如果该key不存在,该命令在插入之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据,插入成功,返回元素的个数。
example:
127.0.0.1:6379> lpush score1 1 2 3 4 5 (integer) 5
rpush key value [value1 value2 ...] 在该list的尾部添加元素
example:
127.0.0.1:6379> rpush score2 1 2 3 4 5 (integer) 5
取值
lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可以为负数,若为-1则表示链表尾部的元素,-2表示倒数第二个,以此类推...
example:
127.0.0.1:6379> lrange score1 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> lrange score2 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
删值
lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素
example:
127.0.0.1:6379> lpop score1 "5" 127.0.0.1:6379> lpop score2 "1"
rpop key:从尾部弹出元素
example:
127.0.0.1:6379> rpop score1 "1" 127.0.0.1:6379> rpop score2 "5"
扩展
llen key:返回指定的key关联的链表中的元素的数量
example:
127.0.0.1:6379> llen score1 (integer) 3 127.0.0.1:6379> llen score2 (integer) 3
lrem key count value:删除count个值为value的元素,如果count大于0,从头到尾遍历并删除count个值为value的元素,如果count小于0,则从尾到头遍历并删除,如果count等于0,则删除链表中所有等于value的元素。
example:
127.0.0.1:6379> lrem score1 1 2 (integer) 1 127.0.0.1:6379> lrem score2 1 2 (integer) 1
通过索引替换
lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛出异常
example:
127.0.0.1:6379> lset score1 0 1 OK 127.0.0.1:6379> lset score2 0 1 OK
在索引前/后插入元素
linsert key before|after pivot value:在pivot元素前或者后插入value这个元素
example:
127.0.0.1:6379> linsert score1 before 3 aaa (integer) 3 127.0.0.1:6379> lrange score1 0 -1 1) "1" 2) "aaa" 3) "3" 127.0.0.1:6379> linsert score1 after 3 bbb (integer) 4 127.0.0.1:6379> lrange score1 0 -1 1) "1" 2) "aaa" 3) "3" 4) "bbb"
rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。[循环操作]
example:
127.0.0.1:6379> lrange score1 0 -1 1) "1" 2) "aaa" 3) "3" 127.0.0.1:6379> lrange score2 0 -1 1) "bbb" 2) "1" 3) "4" 127.0.0.1:6379> rpoplpush score1 score2 "3" 127.0.0.1:6379> lrange score1 0 -1 1) "1" 2) "aaa" 127.0.0.1:6379> lrange score2 0 -1 1) "3" 2) "bbb" 3) "1" 4) "4"