C#利用ServiceStack.Redis访问Redis

  • A+
所属分类:.NET技术
摘要

Redis【REmote DIctionary Server】作为当前比较流行的NoSql数据库,以其高性能,高可用的的特点,应用越来越广泛,深得各大企业和开发人员的青睐。 本文主要以一个简单的小例子,简述ServiceStack.Redis动态库在Redis方面的相关应用,仅供学习分享使用,如有不足之处,还请指正。


概述

Redis【REmote DIctionary Server】作为当前比较流行的NoSql数据库,以其高性能,高可用的的特点,应用越来越广泛,深得各大企业和开发人员的青睐。 本文主要以一个简单的小例子,简述ServiceStack.Redis动态库在Redis方面的相关应用,仅供学习分享使用,如有不足之处,还请指正。

开发环境

相关开发环境,如下所示:

  • Microsoft Visual Studio Community 2019
  • ServiceStack.Redis 动态库
  • Redis 6.0.9 服务器端环境搭建

ServiceStack.Redis的安装

在C#开发中,主要通过NuGet包管理器,来安装ServiceStack.Redis动态库,目前版本为5.10.4,如下所示:

C#利用ServiceStack.Redis访问Redis

 

示例截图

关于C#调用Redis相关示例截图,如下所示:

C#利用ServiceStack.Redis访问Redis

核心代码

关于Redis操作的核心代码,主要分两部分:Redis客户端管理类,Redis客户端操作类。

Redis客户端管理类,主要通过Redis客户端连接池【PooledRedisClientManager】创建客户端对象【IRedisClient】,如下所示:

C#利用ServiceStack.Redis访问RedisC#利用ServiceStack.Redis访问Redis

 1 using ServiceStack.Redis;  2 using System;  3 using System.Collections.Generic;  4 using System.Linq;  5 using System.Text;  6 using System.Threading.Tasks;  7   8 namespace DemoRedis  9 { 10     /// <summary> 11     /// Redis客户端管理类 12     /// </summary> 13     public static class RedisManager 14     { 15         private static PooledRedisClientManager clientManager; 16  17         /// <summary> 18         /// 初始化信息 19         /// </summary> 20         private static void initInfo() 21         { 22             string ipaddr = System.Configuration.ConfigurationManager.AppSettings["ipaddr"]; 23             string port = System.Configuration.ConfigurationManager.AppSettings["port"]; 24             string host = string.Format("{0}:{1}", ipaddr, port); 25             initInfo(new string[] { host }, new string[] { host }); 26         } 27  28         /// <summary> 29         /// 初始化Redis客户端管理 30         /// </summary> 31         /// <param name="readWriteHosts"></param> 32         /// <param name="readOnlyHosts"></param> 33         private static void initInfo(string[] readWriteHosts, string[] readOnlyHosts) 34         { 35             clientManager = new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig 36             { 37                 MaxWritePoolSize = 5, // “写”链接池链接数  38                 MaxReadPoolSize = 5, // “读”链接池链接数  39                 AutoStart = true, 40             }); 41         } 42  43         public static IRedisClient getRedisClient() 44         { 45             if (clientManager == null) 46             { 47                 initInfo(); 48             } 49             return clientManager.GetClient(); 50         } 51  52     } 53  54  55 }

View Code

Redis客户端操作类,主要包括字符串(String),列表(List),哈希结构(Hash),集合(Set),有序集合(Sorted Set)等相关操作功能的封装,如下所示:

C#利用ServiceStack.Redis访问RedisC#利用ServiceStack.Redis访问Redis

  1 using ServiceStack.Redis;   2 using System;   3 using System.Collections.Generic;   4 using System.Linq;   5 using System.Text;   6 using System.Threading.Tasks;   7    8 namespace DemoRedis   9 {  10     public class RedisHelper:IDisposable  11     {  12         private IRedisClient client;  13   14         public RedisHelper()  15         {  16   17         }  18   19         public RedisHelper(IRedisClient client ) {  20             this.client = client;  21         }  22   23         #region 字符串  24   25         public List<string> getAllKeys()  26         {  27             return this.client.GetAllKeys();  28         }  29   30         /// <summary>  31         /// 设置值  32         /// </summary>  33         /// <param name="key"></param>  34         /// <param name="value"></param>  35         public void setString(string key,string value)  36         {  37             this.client.Set(key, value);  38         }  39   40         /// <summary>  41         /// 设置值,带过期时间  42         /// </summary>  43         /// <param name="key"></param>  44         /// <param name="value"></param>  45         /// <param name="expiresIn"></param>  46         public void setString(string key, string value,TimeSpan expiresIn)  47         {  48             this.client.Set(key, value, expiresIn);  49         }  50   51         /// <summary>  52         /// 是否存在  53         /// </summary>  54         /// <param name="key"></param>  55         /// <returns></returns>  56         public bool containsKey(string key)  57         {  58             return this.client.ContainsKey(key);  59         }  60   61         /// <summary>  62         /// 设置字典  63         /// </summary>  64         /// <param name="dic"></param>  65         public void setAll(Dictionary<string,string> dic)  66         {  67             this.client.SetAll(dic);  68         }  69   70         /// <summary>  71         /// 返回旧值,设置新值  72         /// </summary>  73         /// <param name="key"></param>  74         /// <param name="value"></param>  75         /// <returns></returns>  76         public string getAndSetValue(string key,string value) {  77            return this.client.GetAndSetValue(key, value);  78         }  79   80         /// <summary>  81         /// 获取对应的值  82         /// </summary>  83         /// <param name="key"></param>  84         /// <returns></returns>  85         public string getValue(string key) {  86             return this.client.GetValue(key);  87         }  88   89         public string getRandomKey()  90         {  91             return this.client.GetRandomKey();  92         }  93   94         /// <summary>  95         /// 追加值到现有key中  96         /// </summary>  97         /// <param name="key"></param>  98         /// <param name="value"></param>  99         public void appendToValue(string key, string value) { 100             this.client.AppendToValue(key, value); 101         } 102  103         #endregion 104  105         #region List 106  107         /// <summary> 108         /// (队列操作)增加一个值到列表 109         /// </summary> 110         /// <param name="listId"></param> 111         /// <param name="value"></param> 112         public void enqueueItemOnList(string listId ,string value) 113         { 114             this.client.EnqueueItemOnList(listId, value); 115         } 116  117         /// <summary> 118         /// 从队列中出一个 119         /// </summary> 120         /// <param name="listId"></param> 121         /// <returns></returns> 122         public string dequeueItemFromList(string listId) 123         { 124             return this.client.DequeueItemFromList(listId); 125         } 126  127         /// <summary> 128         /// 栈,增加一个值到列表 129         /// </summary> 130         /// <param name="listId"></param> 131         /// <param name="value"></param> 132         public void pushItemToList(string listId, string value) { 133             this.client.PushItemToList(listId, value); 134         } 135  136         /// <summary> 137         /// 栈,从当前列表中出一个值,并返回 138         /// </summary> 139         /// <param name="listId"></param> 140         /// <returns></returns> 141         public string popItemFromList(string listId) 142         { 143             return this.client.PopItemFromList(listId); 144         } 145  146  147         /// <summary> 148         /// 获取某一个位置的值 149         /// </summary> 150         /// <param name="listId"></param> 151         /// <param name="index"></param> 152         /// <returns></returns> 153         public string getItemFromList(string listId, int index) 154         { 155             return this.client.GetItemFromList(listId, index); 156         } 157  158         /// <summary> 159         /// 设置并修改指定位置的值 160         /// </summary> 161         /// <param name="listId"></param> 162         /// <param name="index"></param> 163         /// <param name="value"></param> 164         public void setItemInList(string listId, int index,string value) 165         { 166             this.client.SetItemInList(listId, index, value); 167         } 168  169  170         /// <summary> 171         /// 获取列表所有的值 172         /// </summary> 173         /// <param name="listId"></param> 174         /// <returns></returns> 175         public List<string> getAllItemsFromList(string listId) { 176             return this.client.GetAllItemsFromList(listId); 177         } 178  179         /// <summary> 180         /// 删除所有内容 181         /// </summary> 182         /// <param name="listId"></param> 183         public void removeAllFromList(string listId) { 184             this.client.RemoveAllFromList(listId); 185         } 186  187         /// <summary> 188         /// 删除列表指定元素 189         /// </summary> 190         /// <param name="listId"></param> 191         /// <param name="attr"></param> 192         public void removeItemFromList(string listId, string value) { 193             this.client.RemoveItemFromList(listId, value); 194         } 195  196         /// <summary> 197         /// 获取指定列表的长度 198         /// </summary> 199         /// <param name="listId"></param> 200         /// <returns></returns> 201         public long getListCount(string listId) { 202             return this.client.GetListCount(listId); 203         } 204  205         #endregion 206  207         #region Hash 208  209         /// <summary> 210         /// 设置Hash的值 211         /// </summary> 212         /// <param name="hashId"></param> 213         /// <param name="key"></param> 214         /// <param name="value"></param> 215         /// <returns></returns> 216         public bool setEntryInHash(string hashId, string key, string value) 217         { 218             return this.client.SetEntryInHash(hashId, key, value); 219         } 220  221         /// <summary> 222         /// 获取Hash中的值 223         /// </summary> 224         /// <param name="hashId"></param> 225         /// <param name="key"></param> 226         /// <returns></returns> 227         public string getValueFromHash(string hashId, string key) 228         { 229             return this.client.GetValueFromHash(hashId, key); 230         } 231  232         /// <summary> 233         /// 获取Hash列表中的所有内容 234         /// </summary> 235         /// <param name="hashId"></param> 236         public Dictionary<string,string> getAllEntriesFromHash(string hashId) 237         { 238             return this.client.GetAllEntriesFromHash(hashId); 239         } 240  241         /// <summary> 242         /// 判断Hash是否存在指定的键 243         /// </summary> 244         /// <param name="hashId"></param> 245         /// <param name="key"></param> 246         /// <returns></returns> 247         public bool hashContainsEntry(string hashId, string key) 248         { 249             return this.client.HashContainsEntry(hashId, key); 250         } 251  252         /// <summary> 253         /// 设置多个值到Hash 254         /// </summary> 255         /// <param name="hashId"></param> 256         /// <param name="keyValuePairs"></param> 257         public void setRangeInHash(string hashId,Dictionary<string,string> keyValuePairs) { 258             this.client.SetRangeInHash(hashId, keyValuePairs); 259         } 260  261         /// <summary> 262         /// 获取Hash列表的长度 263         /// </summary> 264         /// <param name="hashId"></param> 265         /// <returns></returns> 266         public long getHashCount(string hashId) { 267             return this.client.GetHashCount(hashId); 268         } 269  270         /// <summary> 271         /// 删除某一个值 272         /// </summary> 273         /// <param name="hashId"></param> 274         /// <param name="key"></param> 275         /// <returns></returns> 276         public bool removeEntryFromHash(string hashId,string key) { 277             return this.client.RemoveEntryFromHash(hashId, key); 278         } 279        280         #endregion 281  282         #region Set 283  284         /// <summary> 285         /// 从Set中获取随机值 286         /// </summary> 287         /// <param name="setId"></param> 288         /// <returns></returns> 289         public string getRandomItemFromSet(string setId) 290         { 291             return this.client.GetRandomItemFromSet(setId); 292         } 293  294         /// <summary> 295         /// 获取所有的值 296         /// </summary> 297         /// <param name="setId"></param> 298         /// <returns></returns> 299         public HashSet<string> getAllItemsFromSet(string setId) 300         { 301            return this.client.GetAllItemsFromSet(setId); 302         } 303  304         /// <summary> 305         /// 获取set的长度 306         /// </summary> 307         /// <param name="setId"></param> 308         /// <returns></returns> 309         public long getSetCount(string setId) 310         { 311             return this.client.GetSetCount(setId); 312         } 313  314         /// <summary> 315         /// 删除某一项 316         /// </summary> 317         /// <param name="setId"></param> 318         /// <param name="item"></param> 319         public void removeItemFromSet(string setId,string item) { 320             this.client.RemoveItemFromSet(setId, item); 321         } 322  323         /// <summary> 324         /// 新增内容 325         /// </summary> 326         /// <param name="setId"></param> 327         /// <param name="item"></param> 328         public void addItemToSet(string setId, string item) { 329             this.client.AddItemToSet(setId, item); 330         } 331  332         /// <summary> 333         /// 增加列表到Set 334         /// </summary> 335         /// <param name="setId"></param> 336         /// <param name="items"></param> 337         public void addRangeToSet(string setId,List<string> items) { 338             this.client.AddRangeToSet(setId, items); 339         } 340  341         #endregion 342  343         #region zset 344  345         /// <summary> 346         /// 添加元素到排序集合 347         /// </summary> 348         /// <param name="setId"></param> 349         /// <param name="value"></param> 350         /// <returns></returns> 351         public bool addItemToSortedSet(string setId,string value) { 352             return this.client.AddItemToSortedSet(setId, value); 353         } 354  355         /// <summary> 356         /// 添加元素到排序集合 357         /// </summary> 358         /// <param name="setId"></param> 359         /// <param name="value"></param> 360         /// <param name="score"></param> 361         /// <returns></returns> 362         public bool addItemToSortedSet(string setId, string value,double score) 363         { 364             return this.client.AddItemToSortedSet(setId, value,score); 365         } 366  367         /// <summary> 368         /// 增加列表到排序集合 369         /// </summary> 370         /// <param name="setId"></param> 371         /// <param name="values"></param> 372         /// <param name="score"></param> 373         /// <returns></returns> 374         public bool addRangeToSortedSet(string setId,List<string> values, double score) { 375            return  this.client.AddRangeToSortedSet(setId, values, score); 376         } 377  378         /// <summary> 379         /// 增加列表到排序集合 380         /// </summary> 381         /// <param name="setId"></param> 382         /// <param name="values"></param> 383         /// <param name="score"></param> 384         /// <returns></returns> 385         public bool addRangeToSortedSet(string setId, List<string> values, long score) 386         { 387             return this.client.AddRangeToSortedSet(setId, values, score); 388         } 389  390         /// <summary> 391         /// 获取所有的集合内容 392         /// </summary> 393         /// <param name="setId"></param> 394         /// <returns></returns> 395         public List<string> getAllItemsFromSortedSet(string setId) { 396             return this.client.GetAllItemsFromSortedSet(setId); 397         } 398  399         /// <summary> 400         /// 倒序获取所有的内容 401         /// </summary> 402         /// <param name="setId"></param> 403         /// <returns></returns> 404         public List<string> getAllItemsFromSortedSetDesc(string setId) { 405             return this.client.GetAllItemsFromSortedSetDesc(setId); 406         } 407  408         /// <summary> 409         /// 带分数一起取出 410         /// </summary> 411         /// <param name="setId"></param> 412         /// <returns></returns> 413         public IDictionary<string, double> getAllWithScoresFromSortedSet(string setId) 414         { 415             return this.client.GetAllWithScoresFromSortedSet(setId); 416         } 417  418         /// <summary> 419         /// 获取对应值的位置 420         /// </summary> 421         /// <param name="setId"></param> 422         /// <param name="value"></param> 423         /// <returns></returns> 424         public long getItemIndexInSortedSet(string setId,string value) 425         { 426             return this.client.GetItemIndexInSortedSet(setId, value); 427         } 428  429         /// <summary> 430         /// 倒序的位置 431         /// </summary> 432         /// <param name="setId"></param> 433         /// <param name="value"></param> 434         /// <returns></returns> 435         public long getItemIndexInSortedSetDesc(string setId, string value) { 436            return this.client.GetItemIndexInSortedSetDesc(setId, value); 437         } 438  439         /// <summary> 440         /// 获取对应元素的分数 441         /// </summary> 442         /// <param name="setId"></param> 443         /// <param name="value"></param> 444         /// <returns></returns> 445         public double getItemScoreInSortedSet(string setId, string value) { 446             return this.client.GetItemScoreInSortedSet(setId, value); 447         } 448  449         /// <summary> 450         ///  451         /// </summary> 452         /// <param name="setId"></param> 453         /// <param name="fromRank"></param> 454         /// <param name="toRank"></param> 455         /// <returns></returns> 456         public List<string> getRangeFromSortedSet(string setId, int fromRank, int toRank) { 457            return  this.client.GetRangeFromSortedSet(setId, fromRank, toRank); 458         } 459  460         public IDictionary<string, double> getRangeWithScoresFromSortedSet(string setId, int fromRank, int toRank) { 461             return this.client.GetRangeWithScoresFromSortedSet(setId, fromRank, toRank); 462         } 463  464         public void Dispose() 465         { 466             if(this.client != null) 467             { 468                 this.client.Dispose(); 469             } 470         } 471         #endregion 472     } 473 }

View Code

关于前端调用功能,主要是各个按钮对应的事件,如下所示:

C#利用ServiceStack.Redis访问RedisC#利用ServiceStack.Redis访问Redis

  1 using System;   2 using System.Collections.Generic;   3 using System.ComponentModel;   4 using System.Data;   5 using System.Drawing;   6 using System.Linq;   7 using System.Text;   8 using System.Threading.Tasks;   9 using System.Windows.Forms;  10   11 namespace DemoRedis  12 {  13     public partial class FrmMain : Form  14     {  15   16         private RedisHelper redisHelper;  17   18         public FrmMain()  19         {  20             InitializeComponent();  21         }  22   23         /// <summary>  24         /// 加载  25         /// </summary>  26         /// <param name="sender"></param>  27         /// <param name="e"></param>  28         private void FrmMain_Load(object sender, EventArgs e)  29         {  30             this.redisHelper = new RedisHelper(RedisManager.getRedisClient());  31         }  32   33         /// <summary>  34         /// 获取所有的Key  35         /// </summary>  36         /// <param name="sender"></param>  37         /// <param name="e"></param>  38         private void btnAllKey_Click(object sender, EventArgs e)  39         {  40             List<string> keys = this.redisHelper.getAllKeys();  41             this.combKeys.Items.AddRange(keys.ToArray());  42             this.combKeys.SelectedIndex = 0;  43         }  44   45         private void btnSetString_Click(object sender, EventArgs e)  46         {  47             string key = this.txtKey1.Text;  48             string value = this.txtValue1.Text;  49             if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))  50             {  51                 return;  52             }  53             this.redisHelper.setString(key, value);  54             MessageBox.Show("设置成功");  55         }  56   57         private void btnGetString_Click(object sender, EventArgs e)  58         {  59             string key = this.txtKey2.Text;  60             if (string.IsNullOrEmpty(key))  61             {  62                 return;  63             }  64             string value = this.redisHelper.getValue(key);  65             if (string.IsNullOrEmpty(value)) {  66                 MessageBox.Show("读取失败,值为空");  67             }  68             else  69             {  70                 this.txtValue2.Text = value;  71             }  72         }  73   74         private void btnAppend_Click(object sender, EventArgs e)  75         {  76             string key = this.txtKey3.Text;  77             string value = this.txtValue3.Text;  78             if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value)) {  79                 return;  80             }  81             this.redisHelper.appendToValue(key, value);  82             MessageBox.Show("追加成功");  83         }  84   85         private void btnAddItemToHash_Click(object sender, EventArgs e)  86         {  87             string hashId = this.txtHashId1.Text;  88             string attr = this.txtHashAttr1.Text;  89             string value = this.txtHashVal1.Text;  90             if (string.IsNullOrEmpty(hashId) || string.IsNullOrEmpty(attr) || string.IsNullOrEmpty(value))  91             {  92                 return;  93             }  94             if (this.redisHelper.setEntryInHash(hashId, attr, value))  95             {  96                 MessageBox.Show("设置成功");  97             }  98             else {  99                 MessageBox.Show("设置失败"); 100             } 101         } 102  103         private void btnGetItemFromHash_Click(object sender, EventArgs e) 104         { 105             string hashId = this.txtHashId2.Text; 106             string attr = this.txtHashAttr2.Text; 107             if (string.IsNullOrEmpty(hashId) || string.IsNullOrEmpty(attr) ) 108             { 109                 return; 110             } 111             string value = this.redisHelper.getValueFromHash(hashId, attr); 112             if (string.IsNullOrEmpty(value)) 113             { 114                 MessageBox.Show("获取失败"); 115             } 116             else 117             { 118                 this.txtHashVal2.Text = value; 119             } 120         } 121  122         private void btnGetHashCount_Click(object sender, EventArgs e) 123         { 124             string hashId = this.txtHashId3.Text; 125             if (string.IsNullOrEmpty(hashId)) 126             { 127                 return; 128             } 129             long count = this.redisHelper.getHashCount(hashId); 130             if (count > 0) 131             { 132                 MessageBox.Show("长度为:" + count); 133             } 134             else { 135                 MessageBox.Show("获取失败"); 136             } 137         } 138  139         private void btnHashContainsEntry_Click(object sender, EventArgs e) 140         { 141             string hashId = this.txtHashId3.Text; 142             string attr = this.txtHashAttr3.Text; 143             if (string.IsNullOrEmpty(hashId) || string.IsNullOrEmpty(attr)) 144             { 145                 return; 146             } 147             bool flag =  this.redisHelper.hashContainsEntry(hashId, attr); 148             if (flag) { 149                 MessageBox.Show("存在"); 150             } 151             else 152             { 153                 MessageBox.Show("不存在"); 154             } 155         } 156  157         private void btnRemoveEntryFromHash_Click(object sender, EventArgs e) 158         { 159             string hashId = this.txtHashId3.Text; 160             string attr = this.txtHashAttr3.Text; 161             if (string.IsNullOrEmpty(hashId) || string.IsNullOrEmpty(attr)) 162             { 163                 return; 164             } 165             bool flag = this.redisHelper.removeEntryFromHash(hashId, attr); 166             if (flag) 167             { 168                 MessageBox.Show("删除成功"); 169             } 170             else 171             { 172                 MessageBox.Show("删除失败"); 173             } 174         } 175  176         private void btnEnqueueItemToList_Click(object sender, EventArgs e) 177         { 178             string listId = this.txtListId1.Text; 179             string item = this.txtListItem1.Text; 180             if (string.IsNullOrEmpty(listId) || string.IsNullOrEmpty(item)) 181             { 182                 return; 183             } 184             this.redisHelper.enqueueItemOnList(listId, item); 185             MessageBox.Show("入队成功"); 186         } 187  188         private void btnPushItemToList_Click(object sender, EventArgs e) 189         { 190             string listId = this.txtListId2.Text; 191             string item = this.txtListItem2.Text; 192             if (string.IsNullOrEmpty(listId) || string.IsNullOrEmpty(item)) 193             { 194                 return; 195             } 196             this.redisHelper.pushItemToList(listId, item); 197             MessageBox.Show("入栈成功"); 198         } 199  200         private void btnGetItemFromList_Click(object sender, EventArgs e) 201         { 202             string listId = this.txtListId3.Text; 203             string index =  this.txtListIndex3.Text; 204             if (string.IsNullOrEmpty(listId) || string.IsNullOrEmpty(index)) 205             { 206                 return; 207             } 208             string value = this.redisHelper.getItemFromList(listId, int.Parse(index)); 209             if (string.IsNullOrEmpty(value)) 210             { 211                 MessageBox.Show("值为:" + value); 212             } 213             else 214             { 215                 MessageBox.Show("获取失败"); 216             } 217         } 218  219         private void btnRemoveItemFromList_Click(object sender, EventArgs e) 220         { 221             string listId = this.txtListId4.Text; 222             string item = this.txtListItem4.Text; 223             if (string.IsNullOrEmpty(listId) || string.IsNullOrEmpty(item)) 224             { 225                 return; 226             } 227             this.redisHelper.removeItemFromList(listId, item); 228             MessageBox.Show("删除成功"); 229         } 230  231         private void btnAddItemToSet_Click(object sender, EventArgs e) 232         { 233             string setId = this.txtSetId1.Text; 234             string item = this.txtSetItem1.Text; 235             if (string.IsNullOrEmpty(setId) || string.IsNullOrEmpty(item)) 236             { 237                 return; 238             } 239             this.redisHelper.addItemToSet(setId, item); 240             MessageBox.Show("添加成功"); 241         } 242  243         private void btnGetSetCount_Click(object sender, EventArgs e) 244         { 245             string setId = this.txtSetId1.Text; 246             if (string.IsNullOrEmpty(setId)) 247             { 248                 return; 249             } 250             long count = this.redisHelper.getSetCount(setId); 251             if (count > 0) 252             { 253                 MessageBox.Show("长度为:" + count); 254             } 255             else 256             { 257                 MessageBox.Show("获取失败"); 258             } 259         } 260  261         private void btnAddItemToSortSet_Click(object sender, EventArgs e) 262         { 263             string setId = this.txtZsetId1.Text; 264             string item = this.txtZsetItem1.Text; 265             if (string.IsNullOrEmpty(setId) || string.IsNullOrEmpty(item)) 266             { 267                 return; 268             } 269             bool flag = this.redisHelper.addItemToSortedSet(setId, item); 270             if (flag) 271             { 272                 MessageBox.Show("添加成功"); 273             } 274             else 275             { 276                 MessageBox.Show("添加失败"); 277             } 278         } 279  280         private void btnGetScoreByValue_Click(object sender, EventArgs e) 281         { 282             string setId = this.txtZsetId2.Text; 283             string item = this.txtZsetItem2.Text; 284             if (string.IsNullOrEmpty(setId) || string.IsNullOrEmpty(item)) 285             { 286                 return; 287             } 288             double score = this.redisHelper.getItemScoreInSortedSet(setId, item); 289             MessageBox.Show("分数为:" + score); 290         } 291  292         private void btnAddItemWithScoreToZset_Click(object sender, EventArgs e) 293         { 294             string setId = this.txtZsetId2.Text; 295             string item = this.txtZsetItem2.Text; 296             string score = this.txtZsetScore2.Text; 297             if (string.IsNullOrEmpty(setId) || string.IsNullOrEmpty(item) || string.IsNullOrEmpty(score)) 298             { 299                 return; 300             } 301             bool flag = this.redisHelper.addItemToSortedSet(setId, item,double.Parse(score)); 302             if (flag) 303             { 304                 MessageBox.Show("添加成功"); 305             } 306             else 307             { 308                 MessageBox.Show("添加失败"); 309             } 310         } 311     } 312 }

View Code

 

注意事项

如果在Redis服务端和客户端不在同一个电脑上,可能会出现无法访问的情况,前端报连接超时错误。则可能是服务端防火墙限制。需要执行如下命令即可:

1 [root@localhost bin]# /sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

另外Redis.conf配置文件中,关于bind配置,默认bind为127.0.0.1只允许本机访问,需要修改,如下所示:

1 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 bind 127.0.0.1 192.168.127.131

其中:192.168.127.131 为服务器IP地址。

备注

使至塞上

朝代:唐代 | 作者:王维

单车欲问边,属国过居延。
征蓬出汉塞,归雁入胡天。
大漠孤烟直,长河落日圆。
萧关逢候骑,都护在燕然。