1.Redis简介
1.2.Redis是什么
Redis是一个开源的,使用ANSI C 编写,高性能的Key-Value的NoSQL数据库。
1.2.Redis特点
(1)基于内存
(2)可持久化数据
(3)具有丰富的数据结构类型,适应非关系型数据的存储需求
(4)支持绝大多数主流开发语言,如C、C++、Java、Python、R、JavaScript等。
(5)支持集群模式,高效、稳定。
1.3数据模型(重点)
(1)键值对形式。
(2)Redis的数据结构类型,指的就是Redis值的结构类型。
1.4.Redis作用
(1)本质是数据库,能存储数据。
Redis能灵活处理非关系型数据的读、写问题,是对MySQL等关系型数据库的补充。
新浪微博就是使用Redis集群做数据库。
(2)缓存数据。
所谓缓存,就是将数据加载到内存中后直接使用,而不是每次都通过IO流从磁盘上读取。好处:读写效率高。
而Redis则是将数据直接存储在内存中,只有当内存空间不足时,将部分数据持久化到磁盘????
2.Redis安装
2.1.说明
本课程是在Linux上安装Redis。
而Redis官方只提供了源码,并没有提供经过编译之后的安装包。
因此,安装Redis,要先编译、后安装。(即源码安装方式)
2.2.redis安装步骤
1)、下载,上传到Linux服务器,并解压
2)、预编译(实际上是检查编译环境的过程)
进入目录: cd /opt/soft/redis-3.2.9/deps/jemalloc
执行预编译 ./configure
在预编译的过程中,会检测安装redis所需的相关依赖,依次安装即可。
(a)缺少c编译环境 yum -y install gcc-c++
预编译不是必须的步骤,它只是在检查编译过程中需要的环境是否满足。
通常源码包中,都有一个可执行的configure脚本,这个脚本执行预编译的脚本。但是有一些源码包中,没有该文件,可以省略预编译步骤。
3)、编译 进入/opt/soft/redis-3.2.9/src
make
4)、安装 进入/opt/soft/redis-3.2.9/src
make install
5)、启动redis服务端(指定配置文件)
拷贝redis.conf文件到/etc 目录下,方便管理。
cp /opt/soft/redis-3.2.9/redis.conf /etc/
/usr/local/bin/redis-server /etc/redis.conf
6)、启动redis客户端,登陆 /usr/local/bin/redis-cli
image.png7)、安装成功
2.3.redis.conf常用配置说明
2.3.1.requirepass foobar
给redis设置密码
image.png在客户端使用auth命令,验证密码。
image.png2.3.2.databases 16
Redis默认有16个数据库,寻址角标从0开始。
默认连接db0
客户端使用select命令,切换数据库
image.png2.3.3.port 6379
指定redis的服务端口,默认6379.
image.png2.3.4.daemonize no
image.pngRedis默认关闭后台进程模式,该成yes,redis服务在后台启动。
2.3.5.loglevel notice(了解)
image.png2.3.6.logfile “ ”
Redis日志输出目录,默认不输出日志到文件。
image.png2.3.7.dbfilename dump.rdb、dir ./
指定数据持久化的文件名及目录。
image.png2.4.将redis添加为系统服务
2.4.1.第一步:开启后台模式
修改配置文件,将daemonize改为yes
2.4.2.第二步:创建shell脚本
说明:Linux系统服务,在/etc/init.d目录下创建redis脚本
###########################
#chkconfig: 2345 10 90
#description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/etc/redis.conf"
PASSWORD=$(cat $CONF|grep '^\s*requirepass'|awk '{print $2}'|sed 's/"//g')
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
if [ -z $PASSWORD ]
then
$CLIEXEC -p $REDISPORT shutdown
else
$CLIEXEC -a $PASSWORD -p $REDISPORT shutdown
fi
#$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
##############################
2.4.3.第三步:添加shell脚本可执行权限
[root@node0927 ~]chmod +x /etc/init.d/redis
2.4.4.第四步:添加Redis开机启动
[root@node0927 ~]chkconfig redis on
[root@node0927 ~]chkconfig redis on
3.Redis的键key
3.1.key的类型
redis的key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。
空字符串也是有效key值。
redis建议使用字符串做为key的类型
127.0.0.1:6379> set user:id:1:username lisi
OK
127.0.0.1:6379> set user:id:1:password 111111
OK
127.0.0.1:6379> set user:id:1:email [<u>lisi</u><u>@</u><u>163.com</u>](mailto:lisi@163.com)
OK
127.0.0.1:6379> keys user:id:1* #查找有几个属性
1) "user:id:1:password"
2) "user:id:1:username"
3) "user:id:1:email"
127.0.0.1:6379>
2.2.key取值规范
(1)键值不需要太长,消耗内存,在数据中查找这类键值的计算成本较高
(2)键值不宜过短,可读性较差,通常建议见名知意。
3.2.1.取值举例
将如下数据库表中的数据,转换为redis的key-value存储
id username password email
1 lisi 111111 lisi@163.com
127.0.0.1:6379> set user:id:1:username lisi
OK
127.0.0.1:6379> set user:id:1:password 111111
OK
127.0.0.1:6379> set user:id:1:email lisi@163.com
OK
127.0.0.1:6379> keys user:id:1* #查找有几个属性
1) "user:id:1:password"
2) "user:id:1:username"
3) "user:id:1:email"
127.0.0.1:6379>
3.3.Key命令
**exists**** key**
检查给定key是否存在。
**del**** key**
**删除一个key**
**del key1 key2 key3**** 删除多个key**
**keys**** pattern**** (模糊查找)**
查找所有符合给定模式 pattern 的key 。
keys * 匹配数据库中所有key 。
keys n?me 匹配name、neme、nfme 等。
keys n* 匹配name、neme、naaaaame等。
keys n[ae]me 只能匹配 name、neme。
**expire** **key** **seconds**
**指定key的过期时间。**
**新添加的key,如果没有指定过期时间,则会一直保存。**
**可以对一个已经带有生存时间的key执行**[**EXPIRE**](#expire)**命令,新指定的生存时间会取代旧的生存时间。**
**ttl** **key (time to live)**
**查看某个key的剩余过期时间,返回值:**
**-2 表示这个key已经过期,删除掉**
**-1 表示没有设置过期时间**
**其它 表示剩余的生存时间,单位为秒。**
**rename**
**语法格式:rename**** key newkey**
将 key 改名为newkey 。
当 key 和newkey 相同,或者key 不存在时,返回一个错误。
当 newkey 已经存在时,[<u>RENAME</u>](#rename) 命令将覆盖旧值。
**type** key
查看key对应的value的数据结构类型。
**其它key命令见redis帮助文档 ****http://doc.redisfans.com/**
3.Redis的值value(数据结构类型)
Redis的数据结构类型,指的就是redis的值value的类型;
Redis常用的数据结构类型:string、list、set、sortedSet、hash
4.4.string类型
string类型是redis最常用的数据结构类型,存储的值为字符串。
4.4.1.String相关命令
set key value
设置一个key,值为value,类型为String类型;如果这个key已经存在,则更新这个key的值。
返回值
1 表示成功
0 表示失败
setnx key value
如果这个key不存在,则设置一个key,值为value;如果key存在,则不做更新。
返回值
1 表示成功
0 表示失败
get key
获取key对应的value值;如果key不存在,则返回nil
mget key1 key2 key3
一次获取多个key的值,如果对应key不存在,则对应返回nil。
incr key
将 key 中储存的数字值增一,然后返回。
如果这个key不存在,那么key的值会先被初始化为0,然后再执行INCR
操作。
如果这个key对应的value值,不能表示数字,则会返回一个错误。
incrby key increment
将key增加指定的步长值。
decr key
将 key 中储存的数字值减一,然后返回。
如果这个key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。
如果这个key对应的value值,不能表示数字,则会返回一个错误。
Redis的key是单线程模式,这就意味一瞬间只有一个线程能够持有这个key,所以可以使用redis解决部分涉及线程安全的业务。比如,在初级时候通过多线程模拟卖票,使用加锁的方式,保证只有一个线程能够持有锁,进行买票业务。
decrby key decrement
将key减少对应的步长值。
append key value
如果key已经存在,则将value追加到这个key原先的value值的末尾。
如果这个key不存在,则执行set操作。
127.0.0.1:6379> help @string 查看string类型的帮助文档
127.0.0.1:6379> help set 查看set命令的帮助文档
网友评论